天天看點

PTA---解碼PAT準考證---(坑點解析)PTA—解碼PAT準考證坑點

PTA—解碼PAT準考證

直達連接配接點我!!

本題很容易了解,思路就不說了,直接解析

坑點

  1. 測試點的坑點: 測試點1和測試點4輸出case那裡,注意看題目中有這樣一句話

    首先在一行中輸出 Case #: 要求,其中 # 是該項要求的編号,從 1 開始;要求 即**複制輸入給出的要求**。随後輸出相應的統計結果

    也就是原封不動地輸出…當讀入日期,考場号等應該是整數的資料時,比如輸入000120,我們讀整型隻讀入了120,是以輸出就是120,但是題目要求輸出的是000120…

  2. 逾時的坑: 第一,記住不要讓資料多次排序(如果你和我存資料方式不一樣請繞過…),第二,少用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;
}