1047. Student List for Course (25)
http://pat.zju.edu.cn/contests/pat-a-practise/1047
跟前面贴的一篇-pat 1039类似,都是根据课程及注册学生进行排序。
思路:创建一个课程结构体,里面有注册的学生及本课程总人数。注意,每个学生用一个整数来表示(题中说学生姓名为三个字母+1个数字,例如ABC4)这样存储和搜索的效率最高。
按如下方法储存:A减字母A再左移24位,B减字母A再左移16位等等,最后把他们都加起来得到一个整数。这个整数解释姓名时,按相反操作即可。
PS. 位移操作<< 优先级比加法还低?总之加括号就对了~
View Code
#include <stdio.h> #include <algorithm> using namespace std; struct Course{ int name[400];//这个数字试试的~一门课程最多多少人注册没说。。 int count; }course[2505]; int main(){ int N, K; scanf("%d %d",&N,&K); int i,j; char stuname[5]; int num,temp; for(i=0;i<N;i++){ scanf("%s %d",stuname,&num); for(j=0;j<num;j++){ scanf("%d",&temp); course[temp].name[course[temp].count++] = ((stuname[0]-'A')<<24) + ((stuname[1]-'A')<<16) + ((stuname[2]-'A')<<8) + ((stuname[3]-'0')); } } for(i=1;i<=K;i++){ printf("%d %d\n",i,course[i].count); sort(course[i].name,course[i].name+course[i].count); for(j=0;j<course[i].count;j++){ printf("%c%c%c%c\n",((course[i].name[j]&0xFF000000)>>24)+'A',((course[i].name[j]&0x00FF0000)>>16)+'A',((course[i].name[j]&0x0000FF00)>>8)+'A',(course[i].name[j]&0x000000FF)+'0'); } } return 0; }

浙公网安备 33010602011771号