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