A1153 Decode Registration Card of PAT
Link
1153 Decode Registration Card of PAT (25 分)
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 (≤104) and M (≤100), the numbers of cards and the queries, respectively.
Then N lines follow, each gives a card number and the owner’s score (integer in [0,100]), 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 corresponding Term
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 corresponding Term
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 corresponding Term
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
where Nt
is the total number of testees and Ns
is their total score;
for a type 3 query, output in the format Site Nt
where Site
is the site number and Nt
is the total number of testees at Site
. The output must be in non-increasing order of Nt
's, or in increasing order of site numbers if there is a tie of Nt
.
If the result of a query is empty, simply print NA
.
Sample Input & Output
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
Topic
题意比较好理解。
Analysis & Code
简单题,唯一复杂点在1 / 2 / 3
三种查询情况上。
代码写的还是比较麻烦的,使用两次结构体排序。
注意:
1、超时问题,输出不要使用cout
不然基本就会超时,使用printf
代替。但是printf(string)
会出现错误,需要加上.c_str()
,例如:printf("%s",p[i].reg.c_str());
。
2、需要注意格式问题,最后没有多余行。
3、还是与A1152 Google Recruitment一样的字符串截取问题。
4、如果出现段错误就是结构体开的不够大,10^4 =10000
。
#include<bits/stdc++.h>
using namespace std;
struct person
{
string level,reg;
string site,date,testee;
int score,tsite,tdate,ttestee;
}p[10001];
struct ssite //Query3:存储某日期对应的Site号及Site的数量
{
int ttsite,num;
}ss[10001];
bool cmp1(person x,person y)
{
if(x.score!=y.score)
return x.score>y.score;
return x.reg<y.reg;
}
bool cmp2(ssite x,ssite y)
{
if(x.num!=y.num)
return x.num>y.num;
return x.ttsite<y.ttsite;
}
void query1(string s,int n)
{
int flag=1;
sort(p,p+n,cmp1);
for(int i=0;i<n;i++)
{
if(p[i].level == s)
{
flag=0;
printf("\n%s %d",p[i].reg.c_str(),p[i].score);
}
}
if(flag)
printf("\nNA");
}
void query2(string s,int n)
{
int num=0,sum=0;
for(int i=0;i<n;i++)
{
if(p[i].site == s)
{
num++;
sum += p[i].score;
}
}
if(num)
printf("\n%d %d",num,sum);
else
printf("\nNA");
}
void query3(string s,int n)
{
int flag=1,arr[10001]={0},num=0,maxn=0;
for(int i=0;i<n;i++)
{
if(p[i].date == s)
{
flag=0;
arr[p[i].tsite]++;
maxn = maxn>p[i].tsite?maxn:p[i].tsite;
//纪录座位号的最大值,方便下个循环将数据存进结构体中
}
}
int k=0;
for(int i=0;i<=maxn;i++)
{
if(arr[i])
{
ss[k].ttsite=i;
ss[k++].num=arr[i];
num++;//纪录不同的座位号的数量
}
}
sort(ss,ss+num,cmp2);
for(int i=0;i<num;i++)
printf("\n%d %d",ss[i].ttsite,ss[i].num);
if(flag)
printf("\nNA");
}
int main()
{
int n,m,k;
cin>>n>>m;
string s;
for(int i=0;i<n;i++)
{
cin>>s>>p[i].score;
p[i].reg = s;
p[i].level = s.substr(0,1);
p[i].site = s.substr(1,3);
p[i].date = s.substr(4,6);
p[i].testee = s.substr(10);
p[i].tsite = stoi(p[i].site);
}
for(int i=1;i<=m;i++)
{
cin>>k>>s;
if(i!=1)
cout<<endl;
cout<<"Case "<<i<<": "<<k<<" "<<s;
if(k==1)
query1(s,n);
else if(k==2)
query2(s,n);
else if(k==3)
query3(s,n);
}
return 0;
}