1095 解码PAT准考证 (25分)

1095 解码PAT准考证 (25分)
 

PAT 准考证号由 4 部分组成:

  • 第 1 位是级别,即 T 代表顶级;A 代表甲级;B 代表乙级;
  • 第 2~4 位是考场编号,范围从 101 到 999;
  • 第 5~10 位是考试日期,格式为年、月、日顺次各占 2 位;
  • 最后 11~13 位是考生编号,范围从 000 到 999。

现给定一系列考生的准考证号和他们的成绩,请你按照要求输出各种统计信息。

输入格式:

输入首先在一行中给出两个正整数 N(≤)和 M(≤),分别为考生人数和统计要求的个数。

接下来 N 行,每行给出一个考生的准考证号和其分数(在区间 [ 内的整数),其间以空格分隔。

考生信息之后,再给出 M 行,每行给出一个统计要求,格式为:类型 指令,其中

  • 类型 为 1 表示要求按分数非升序输出某个指定级别的考生的成绩,对应的 指令 则给出代表指定级别的字母;
  • 类型 为 2 表示要求将某指定考场的考生人数和总分统计输出,对应的 指令 则给出指定考场的编号;
  • 类型 为 3 表示要求将某指定日期的考生人数分考场统计输出,对应的 指令 则给出指定日期,格式与准考证上日期相同。

输出格式:

对每项统计要求,首先在一行中输出 Case #: 要求,其中 # 是该项要求的编号,从 1 开始;要求 即复制输入给出的要求。随后输出相应的统计结果:

  • 类型 为 1 的指令,输出格式与输入的考生信息格式相同,即 准考证号 成绩。对于分数并列的考生,按其准考证号的字典序递增输出(题目保证无重复准考证号);
  • 类型 为 2 的指令,按 人数 总分 的格式输出;
  • 类型 为 3 的指令,输出按人数非递增顺序,格式为 考场编号 总人数。若人数并列则按考场编号递增顺序输出。

如果查询结果为空,则输出 NA

输入样例:

8 4
B123180908127 99
B102180908003 86
A112180318002 98
T107150310127 62
A107180908108 100
T123180908010 78
B112160918035 88
A107180908021 98
1 A
2 107
3 180908
2 999
 

输出样例:

Case 1: 1 A
A107180908108 100
A107180908021 98
A112180318002 98
Case 2: 2 107
3 260
Case 3: 3 180908
107 2
123 2
102 1
Case 4: 2 999
NA



代码讲解:首先要先把结构体创建好,否则多个指令反复从id当中求,会增加
复杂度很可能超时。。。还有千万别忘了时间是6位的别忘了前导0.。。

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 typedef struct 
  5 {
  6     char id[20];
  7     int socre;
  8     char rank;
  9     int kao;
 10     int date;
 11     
 12 }stu;   //学生结构体
 13 typedef struct 
 14 {
 15     int id;
 16     int count;
 17 }exam;  //考场结构体,方便指令3 hash而设的
 18 int cmp(const void *a,const void *b)  //指令一排序
 19 {
 20    stu *c=(stu *)a;
 21    stu *d=(stu *)b;
 22    if(c->socre!=d->socre)
 23    return d->socre-c->socre;
 24    else
 25    return strcmp(c->id,d->id);
 26     
 27 }
 28 int cmp1(const void *a,const void *b)   //指令3 排序
 29 {
 30     exam *c=(exam *)a;
 31     exam *d=(exam *)b;
 32     if(c->count!=d->count)
 33     {
 34         return d->count-c->count;
 35     }
 36     else
 37     return c->id-d->id;
 38     
 39 }
 40 int main()
 41 {
 42     int n,i,j,m,type,num,temp,flag,sum,count;
 43     exam e[1000];   //为了hash 考场
 44     char c;
 45     stu s[10001];
 46     scanf("%d %d",&n,&m);
 47     for(i=0;i<n;i++)      //预处理各自属性
 48     {
 49         scanf("%s %d",s[i].id,&s[i].socre);
 50            s[i].rank=s[i].id[0];
 51            temp=0;
 52            for(j=1;j<=3;j++)     //处理考场号
 53            {
 54                temp=temp*10+s[i].id[j]-'0';
 55             }
 56              s[i].kao=temp;
 57             temp=0;
 58             for(j=4;j<=9;j++)   //处理时间
 59             {
 60                 temp=temp*10+s[i].id[j]-'0';
 61                 
 62             }
 63             s[i].date=temp;    
 64             
 65     }
 66     qsort(s,n,sizeof(stu),cmp);   //排序 各个考生
 67     for(i=1;i<=m;i++)
 68     {
 69         scanf("%d",&type);
 70         flag=0;
 71         if(type==1)
 72         {
 73             scanf(" %c",&c);
 74             printf("Case %d: %d %c\n",i,type,c);
 75             for(j=0;j<n;j++)
 76             {
 77                 if(s[j].rank==c)
 78                 {
 79                     printf("%s %d\n",s[j].id,s[j].socre);
 80                     flag=1;
 81                 }
 82             }
 83             if(!flag)
 84             printf("NA\n");
 85         }
 86         else
 87         if(type==2)
 88         {
 89             scanf("%d",&num);
 90             sum=0,count=0;
 91             printf("Case %d: %d %d\n",i,type,num);
 92             for(j=0;j<n;j++)
 93             {
 94                 if(s[j].kao==num)
 95                 {
 96                     count++;
 97                     sum+=s[j].socre;
 98                 }
 99             }
100             if(count==0)
101             {
102                 printf("NA\n");
103             }
104             else
105             printf("%d %d\n",count,sum);
106             
107         }
108         else
109         if(type==3)
110         {
111             flag=0;
112             scanf("%d",&num);
113             printf("Case %d: %d %06d\n",i,type,num);//不要忘了时间是6位
114             memset(e,0,sizeof(e));
115             for(j=0;j<n;j++)
116             {
117                 if(s[j].date==num)
118                 {
119                     flag=1;
120                     e[s[j].kao].count++;   //利用hash存储
121                     e[s[j].kao].id=s[j].kao;
122                 }
123             }
124             if(!flag)
125             {
126                 printf("NA\n");
127             }
128             else
129             {
130                 qsort(e,1000,sizeof(exam),cmp1);  //将他排序
131                 for(j=0;j<1000&&e[j].count!=0;j++)
132                 {
133                     printf("%d %d\n",e[j].id,e[j].count);
134                     
135                 }
136             }
137                 
138         }
139         
140     }    
141     return 0;
142 }

 

 
posted @ 2020-11-24 16:27  罪梦者  阅读(210)  评论(0)    收藏  举报