PTA—解码PAT准考证
直达连接点我!!
本题很容易理解,思路就不说了,直接解析
坑点
- 测试点的坑点: 测试点1和测试点4输出case那里,注意看题目中有这样一句话
首先在一行中输出 Case #: 要求,其中 # 是该项要求的编号,从 1 开始;要求 即**复制输入给出的要求**。随后输出相应的统计结果
也就是原封不动地输出…当读入日期,考场号等应该是整数的数据时,比如输入000120,我们读整型只读入了120,所以输出就是120,但是题目要求输出的是000120… - 超时的坑: 第一,记住不要让数据多次排序(如果你和我存数据方式不一样请绕过…),第二,少用C++的输入输出(cin,cout)…
AC代码
(这里date写成了data不要介意…《懒得改了》)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
struct stu
{
string id;
//char id[15];
//char lev;
int examid;
int data;
int score;
//int stuid; 输出上没用
}a[10005],b[10005],t[10005];
int top1,top2,top3;
int kc[1005][2]; //0->考场人员个数 1->考场总分
bool cmp(stu x,stu y)
{
if(x.score == y.score)
return x.id < y.id;
else
return x.score > y.score;
}
struct data_kc
{
int id;
int number;
data_kc()
{
id = 0;
number = 0;
}
};
bool cmp1(data_kc a,data_kc b)
{
if(a.number == b.number)
return a.id < b.id;
else
return a.number > b.number;
}
int get_exid(const char* s) //获得此字符串的考场号
{
int i;
int sum = 0;
for(i=1;i<=3;i++)
sum*=10,sum += (s[i]-'0');
return sum;
}
int get_data(const char* s) //获得此字符串的考试时间
{
int i,sum = 0;
for(i=4;i<=9;i++)
sum*=10,sum += (s[i] - '0');
return sum;
}
int flag1,flag2,flag3;
void ch1()
{
char c;
int i;
getchar();
scanf("%c",&c);
printf(" %c\n",c);
if(c == 'T' && top3 != 0)
{
if(flag3 == 0)
sort(t,t+top3,cmp),flag3=1;
for(i=0;i<top3;i++)
{
cout<<t[i].id;
printf(" %d\n",t[i].score);
}
}
else if(c == 'A' && top1 != 0)
{
if(flag1 == 0)
sort(a,a+top1,cmp),flag1=1;
for(i=0;i<top1;i++)
{
cout<<a[i].id;
printf(" %d\n",a[i].score);
}
}
else if(c == 'B' && top2 != 0)
{
if(flag2 == 0)
sort(b,b+top2,cmp),flag2 = 1;
for(i=0;i<top2;i++)
{
cout<<b[i].id;
printf(" %d\n",b[i].score);
}
}
else
printf("NA\n");
}
int str_2_int(const char *s) //字符串转整型
{
int i,sum=0;
for(;*s != '\0';s++)
sum*=10,sum += *s-'0';
return sum;
}
void ch2()
{
char kci[30];
scanf("%s",kci);
printf(" %s\n",kci);
int kcid = str_2_int(kci);
if(kcid < 101 || kcid > 999 || kc[kcid][0] == 0 && kc[kcid][1] == 0)
printf("NA\n");
else
printf("%d %d\n",kc[kcid][0],kc[kcid][1]);
}
void ch3()
{
char da[30];
scanf("%s",da);
printf(" %s\n",da);
int data = str_2_int(da);
int book[1005] = {0},i,top4 = 1,id;
data_kc k[1000]; //临时存当日的考场情况
for(i=0;i<top1;i++)
if(a[i].data == data)
{
id = a[i].examid;
if(book[id] == 0)
{
book[id] = top4;
k[top4].id = id;
k[top4].number++;
top4++;
}
else
{
int idx = book[id];
k[idx].number++;
}
}
for(i=0;i<top2;i++)
if(b[i].data == data)
{
id = b[i].examid;
if(book[id] == 0)
{
book[id] = top4;
k[top4].id = id;
k[top4].number++;
top4++;
}
else
{
int idx = book[id];
k[idx].number++;
}
}
for(i=0;i<top3;i++)
if(t[i].data == data)
{
id = t[i].examid;
if(book[id] == 0)
{
book[id] = top4;
k[top4].id = id;
k[top4].number++;
top4++;
}
else
{
int idx = book[id];
k[idx].number++;
}
}
if(top4 == 1)
{
printf("NA\n");
return ;
}
sort(k+1,k+top4,cmp1);
for(i=1;i<top4;i++)
printf("%d %d\n",k[i].id,k[i].number);
}
void print(int choice)
{
if(choice == 1)
ch1();
else if(choice == 2)
ch2();
else if(choice == 3)
ch3();
else
{
char s[50];
scanf("%s",s);
printf(" %s\n",s);
printf("NA\n");
return ;
}
}
int main()
{
int n,m,i;
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
{
char id[15];
int score;
scanf("%s %d",id,&score);
if(id[0] == 'A')
{
a[top1].id = id;
a[top1].score = score;
int exid = get_exid(id);
a[top1].examid = exid;
kc[exid][0]++;
kc[exid][1] += score;
a[top1].data = get_data(id);
top1++;
}
else if(id[0] == 'B')
{
b[top2].id = id;
b[top2].score = score;
int exid = get_exid(id);
b[top2].examid = exid;
kc[exid][0]++;
kc[exid][1] += score;
b[top2].data = get_data(id);
top2++;
}
else
{
t[top3].id = id;
t[top3].score = score;
int exid = get_exid(id);
t[top3].examid = exid;
kc[exid][0]++;
kc[exid][1] += score;
t[top3].data = get_data(id);
top3++;
}
}
for(i=0;i<m;i++)
{
int choice;
scanf("%d",&choice);
printf("Case %d: %d",i+1,choice);
print(choice);
}
//puts("");
//puts("");
//for(i=0;i<top2;i++)
//printf("%d %d\n",b[i].data,b[i].examid);
return 0;
}