俊介三

一天更新一点,一天积累一点

导航

1047. Student List for Course (25)

Posted on 2013-03-08 13:35  俊介三在前进  阅读(503)  评论(0)    收藏  举报

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;
}