題目
鏈接:PAT (Basic Level) Practice 1095 解碼PAT準(zhǔn)考證
PAT 準(zhǔn)考證號(hào)由 4 部分組成:
- 第 1 位是級(jí)別葱绒,即
T
代表頂級(jí)菠秒;A
代表甲級(jí);B
代表乙級(jí)南片;- 第 2~4 位是考場(chǎng)編號(hào),范圍從 101 到 999;
- 第 5~10 位是考試日期种柑,格式為年、月匹耕、日順次各占 2 位聚请;
- 最后 11~13 位是考生編號(hào),范圍從 000 到 999稳其。
現(xiàn)給定一系列考生的準(zhǔn)考證號(hào)和他們的成績(jī)驶赏,請(qǐng)你按照要求輸出各種統(tǒng)計(jì)信息。
輸入格式:
輸入首先在一行中給出兩個(gè)正整數(shù)
和
既鞠,分別為考生人數(shù)和統(tǒng)計(jì)要求的個(gè)數(shù)煤傍。
接下來(lái) N 行,每行給出一個(gè)考生的準(zhǔn)考證號(hào)和其分?jǐn)?shù)(在區(qū)間 [0,100] 內(nèi)的整數(shù))嘱蛋,其間以空格分隔蚯姆。
考生信息之后,再給出 M 行洒敏,每行給出一個(gè)統(tǒng)計(jì)要求龄恋,格式為:類(lèi)型 指令
,其中
類(lèi)型
為 1 表示要求按分?jǐn)?shù)非升序輸出某個(gè)指定級(jí)別的考生的成績(jī)凶伙,對(duì)應(yīng)的指令
則給出代表指定級(jí)別的字母郭毕;類(lèi)型
為 2 表示要求將某指定考場(chǎng)的考生人數(shù)和總分統(tǒng)計(jì)輸出,對(duì)應(yīng)的指令
則給出指定考場(chǎng)的編號(hào)函荣;類(lèi)型
為 3 表示要求將某指定日期的考生人數(shù)分考場(chǎng)統(tǒng)計(jì)輸出显押,對(duì)應(yīng)的指令
則給出指定日期,格式與準(zhǔn)考證上日期相同傻挂。輸出格式:
對(duì)每項(xiàng)統(tǒng)計(jì)要求乘碑,首先在一行中輸出
Case #: 要求
,其中#
是該項(xiàng)要求的編號(hào)踊谋,從 1 開(kāi)始蝉仇;要求
即復(fù)制輸入給出的要求。隨后輸出相應(yīng)的統(tǒng)計(jì)結(jié)果:
類(lèi)型
為 1 的指令沉迹,輸出格式與輸入的考生信息格式相同,即準(zhǔn)考證號(hào) 成績(jī)
害驹。對(duì)于分?jǐn)?shù)并列的考生,按其準(zhǔn)考證號(hào)的字典序遞增輸出(題目保證無(wú)重復(fù)準(zhǔn)考證號(hào))宛官;類(lèi)型
為 2 的指令,按人數(shù) 總分
的格式輸出底洗;類(lèi)型
為 3 的指令,輸出按人數(shù)非遞增順序亥揖,格式為考場(chǎng)編號(hào) 總?cè)藬?shù)
。若人數(shù)并列則按考場(chǎng)編號(hào)遞增順序輸出费变。如果查詢(xún)結(jié)果為空,則輸出
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
思路
這道題磨了一個(gè)多星期還是沒(méi)解決,現(xiàn)在還只能過(guò)一個(gè)點(diǎn)15分滑负,3個(gè)點(diǎn)超時(shí)(用了三個(gè)for循環(huán)嵌套,不超時(shí)才怪)橙困。
先留著過(guò)些日子再改吧,歡迎討論凡傅。
- 類(lèi)型1的要求涉及成績(jī)和級(jí)別(準(zhǔn)考證號(hào))肠缔;
- 類(lèi)型2的要求涉及考場(chǎng)編號(hào)和考場(chǎng)人數(shù)和成績(jī)夏跷;
- 類(lèi)型3的要求涉及日期和考場(chǎng)考生人數(shù)。
所以用兩個(gè)結(jié)構(gòu)體數(shù)組分別存入考生和考場(chǎng)信息明未,考生信息包括準(zhǔn)考證號(hào)槽华、和成績(jī),考場(chǎng)信息包括考場(chǎng)編號(hào)和考場(chǎng)人數(shù)趟妥;考場(chǎng)編號(hào)用考場(chǎng)結(jié)構(gòu)體數(shù)組下標(biāo)表示猫态。
代碼
#include<stdio.h>
#include<string.h>
typedef struct student{
int grade;
char Tnumb[14];
}Student;
typedef struct eroom{
int Pamou;
int Tgrade;
}Eroom;
int main()
{
int N, M;
scanf("%d %d", &N, &M);
Student S[N];
Eroom E[1000];
for(int i = 101; i < 1000; i++){ //結(jié)構(gòu)體初始化
E[i].Pamou = 0;
E[i].Tgrade = 0;
}
for(int i = 0; i < N; i++){
char str[14];
int gra, En;
scanf("%s %d", str, &gra);
strcpy(S[i].Tnumb, str);
S[i].grade = gra;
En = (S[i].Tnumb[1] - '0') * 100 + (S[i].Tnumb[2] - '0') * 10 + (S[i].Tnumb[3] - '0');
E[En].Pamou += 1;
E[En].Tgrade += gra;
}
for(int i = 0; i < M; i++){
int type = 0, flag = 0;
scanf("%d", &type);
if(type == 1){ //類(lèi)型1
char level;
Student S2[N];
int cnt = 0;
scanf(" %c", &level);
for(int j = 0; j < N; j++){
if(S[j].Tnumb[0] == level){
strcpy(S2[cnt].Tnumb, S[j].Tnumb); //得到符合條件的學(xué)生數(shù)據(jù)
S2[cnt].grade = S[j].grade;
cnt++;
flag = 1;
}
}
Student temp;
for(int p = 0; p < cnt; p++){ //排序
for(int q = p; q < cnt; q++){
if((S2[p].grade < S2[q].grade)||(S2[p].grade == S2[q].grade && S2[p].Tnumb < S2[q].Tnumb)){
//temp = S2[p];
strcpy(temp.Tnumb, S2[p].Tnumb);
temp.grade = S2[p].grade;
//S2[p] = S2[q];
strcpy(S2[p].Tnumb, S2[q].Tnumb);
S2[p].grade = S2[q].grade;
//S2[q] = temp;
strcpy(S2[q].Tnumb, temp.Tnumb);
S2[q].grade = temp.grade;
}
}
}
printf("Case %d: %d %c\n", i+1, type, level);
if(flag == 0){
printf("NA\n");
}
else{
for(int k = 0; k < cnt; k++){
printf("%s %d\n", S2[k].Tnumb, S2[k].grade);
}
}
}
else if(type == 2){ //類(lèi)型2
int Enumb;
scanf("%d", &Enumb);
printf("Case %d: %d %03d\n", i+1, type, Enumb);
if(E[Enumb].Pamou == 0){
printf("NA\n");
}
else{
printf("%d %d\n", E[Enumb].Pamou, E[Enumb].Tgrade);
}
}
else if(type == 3){ //類(lèi)型3
int data;
scanf("%d", &data);
Eroom E2[1000];
for(int j = 101; j < 1000; j++){ //結(jié)構(gòu)體初始化
E2[j].Pamou = 0;
E2[j].Tgrade = 0;
}
int dat2,cnt2 = 0,en, flag3 = 0;
for(int j = 0; j < N; j++){
dat2 = (S[j].Tnumb[4] - '0') * 100000 + (S[j].Tnumb[5] - '0') * 10000 + (S[j].Tnumb[6] - '0')* 1000 + (S[j].Tnumb[7] - '0') * 100+ (S[j].Tnumb[8] - '0') * 10 + (S[j].Tnumb[9] - '0');
if(data == dat2){
en = (S[j].Tnumb[1] - '0') * 100 + (S[j].Tnumb[2] - '0') * 10 + (S[j].Tnumb[3] - '0');
E2[en].Pamou++;
flag3 = 1; //flag用來(lái)表示查詢(xún)是否為空
}
}
printf("Case %d: %d %d\n", i+1, type, data);
if(flag3 == 0){
printf("NA\n");
}
else{
for(int k = N; k > 0; k--){
for(int j = 101; j < 1000; j++){
if(E2[j].Pamou == k){
printf("%d %d\n", j, k);
}
}
}
}
}
}
return 0;
}
---END---
其它相關(guān)問(wèn)題
PAT-B 1091 N-自守?cái)?shù)(C語(yǔ)言)
PAT-B 1092 最好吃的月餅(C語(yǔ)言)
PAT-B 1093 字符串A+B(C語(yǔ)言)
PAT-B 1094 谷歌的招聘(C語(yǔ)言)