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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值