c++解题代码
#include <cstdio>
#include <cstdlib>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;
char table[27]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int hashtable[2501]={false}; //hash表记录需要打印出的课程的课程编号
void convert(int it, char *t ){ //将数字转换成“ABC1”形式的字符串
int cnt = 0, yushu[4] = {0};
for(int i=3;i>=0;i--){
yushu[i]=it%26;it/=26;
}
*t++=table[yushu[0]];
*t++=table[yushu[1]];
*t++=table[yushu[2]];
*t++=yushu[3]+'0';
*t='\0';
}
bool cmp(int a,int b){
return a < b;
} //升序
int main(){
vector< int >vi[2501]; //下标为课号,每一个vi分别插入课号
int n, m, name_num, c=0, d=0; //c为每个人选课数,d为所选课的课号
char cnt[4];
char name[5] = {0};
scanf("%d %d",&n,&m); // n人数 m课程总数;
for(int i=0; i<n; i++){
getchar();
scanf("%s",name);
name_num=(name[0]-'A')*26*26*26+(name[1]-'A')*26*26+(name[2]-'A')*26+(name[3]-'0');
//将“ABC1”形式的字符串转换成数字放入name_num
scanf("%d",&c);
for(int j=0; j<c; j++){
scanf("%d",&d);
hashtable[d]=true;
vi[d].push_back(name_num);
}
}
for(int i = 1; m != 0;i++){
if(hashtable[i] == true){
printf("%d %d\n", i, vi[i].size());
sort(vi[i].begin(),vi[i].end(),cmp);
for(vector< int >::iterator it = vi[i].begin(); it < vi[i].end(); it++){ //指针自加 ,历遍vi[i]
convert(*it,cnt);
printf("%s",cnt);
if(m!=1 || it != vi[i].end()-1){
printf("\n"); //若不在输出的最后一行则换行。
}
}
m--;
}
}
return 0;
}
还请大家多多指出代码冗余之处,转载请注明出处。