A registration card number of PAT consists of 4 parts:
- the 1st letter represents the test level, namely,
T
for the top level,A
for advance andB
for basic; - the 2nd - 4th digits are the test site number, ranged from 101 to 999;
- the 5th - 10th digits give the test date, in the form of
yymmdd
; - finally the 11th - 13th digits are the testee's number, ranged from 000 to 999.
Now given a set of registration card numbers and the scores of the card owners, you are supposed to output the various statistics according to the given queries.
Input Specification:
Each input file contains one test case. For each case, the first line gives two positive integers N (≤) and M (≤), the numbers of cards and the queries, respectively.
Then N lines follow, each gives a card number and the owner's score (integer in [), separated by a space.
After the info of testees, there are M lines, each gives a query in the format Type Term
, where
Type
being 1 means to output all the testees on a given level, in non-increasing order of their scores. The correspondingTerm
will be the letter which specifies the level;Type
being 2 means to output the total number of testees together with their total scores in a given site. The correspondingTerm
will then be the site number;Type
being 3 means to output the total number of testees of every site for a given test date. The correspondingTerm
will then be the date, given in the same format as in the registration card.
Output Specification:
For each query, first print in a line Case #: input
, where #
is the index of the query case, starting from 1; and input
is a copy of the corresponding input query. Then output as requested:
- for a type 1 query, the output format is the same as in input, that is,
CardNumber Score
. If there is a tie of the scores, output in increasing alphabetical order of their card numbers (uniqueness of the card numbers is guaranteed); - for a type 2 query, output in the format
Nt Ns
whereNt
is the total number of testees andNs
is their total score; - for a type 3 query, output in the format
Site Nt
whereSite
is the site number andNt
is the total number of testees atSite
. The output must be in non-increasing order ofNt
's, or in increasing order of site numbers if there is a tie ofNt
.
If the result of a query is empty, simply print NA
.
Sample Input:
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
Sample Output:
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
类型1和2都好处理,就是3需要map,直接记录考场号和日期拼接字符串对应考生的个数,然后排序。
代码:
#include <iostream> #include <vector> #include <cstring> #include <cstdio> #include <cstdlib> #include <algorithm> #include <map> #define MAX 10001 using namespace std; int n,m; struct stu { char Tid[14]; int score; }s[MAX]; char *Substr(char *a,int l,int r) { char *t = (char *)malloc(sizeof(char) * (r - l + 1)); for(int i = l;i < r;i ++) { t[i - l] = a[i]; } t[r - l] = 0; return t; } int snum[1000],sscore[1000];///考场对应考生人数 和 总分的数组 int lnum[3]; char *str[MAX];///记录考场和日期总串 int c; map<string,int> mp; bool cmp(const stu &a,const stu &b) { if(a.Tid[0] == b.Tid[0]) { if(a.score == b.score) return strcmp(a.Tid,b.Tid) < 0; return a.score > b.score; } return a.Tid[0] < b.Tid[0]; } bool cmp1(const char *a,const char *b) { if(mp[a] == mp[b]) return strcmp(a,b) < 0; return mp[a] > mp[b]; } int main() { char *t; scanf("%d%d",&n,&m); for(int i = 0;i < n;i ++) { scanf("%s %d",s[i].Tid,&s[i].score); t = Substr(s[i].Tid,1,4); int d = atoi(t); snum[d] ++; sscore[d] += s[i].score; int dd = s[i].Tid[0] == 'T' ? 2 : s[i].Tid[0] - 'A'; lnum[dd] ++; t = Substr(s[i].Tid,1,10); if(!mp[t]) { str[c] = (char *)malloc(sizeof(char) * 10); strcpy(str[c],t); c ++; } mp[t] ++; } sort(s,s + n,cmp); sort(str,str + c,cmp1); int choice,site; char level[2],date[7]; for(int i = 1;i <= m;i ++) { scanf("%d",&choice); printf("Case %d: %d ",i,choice); if(choice == 1) { scanf("%s",level); printf("%s\n",level); int l,r; if(level[0] == 'A') l = 0,r = lnum[0]; else if(level[0] == 'B') l = lnum[0],r = lnum[1]; else l = lnum[0] + lnum[1],r = lnum[2]; if(r == 0) { printf("NA\n"); continue; } for(int j = 0;j < r;j ++) { printf("%s %d\n",s[l + j].Tid,s[l + j].score); } } else if(choice == 2) { scanf("%d",&site); printf("%d\n",site); if(!snum[site]) { printf("NA\n"); } else { printf("%d %d\n",snum[site],sscore[site]); } } else { scanf("%s",&date); printf("%s\n",date); int d = 0; for(int j = 0;j < c;j ++) { if(strcmp(Substr(str[j],3,9),date) == 0) { printf("%s %d\n",Substr(str[j],0,3),mp[str[j]]); d ++; } } if(d == 0) printf("NA\n"); } } }