PAT A1153 Decode Registration Card of PAT【排序】

本文分享了一次使用C++解决学生数据处理问题的竞赛经历,详细记录了从初稿到优化过程中的各种坑,包括string与char数组转换、strncpy使用陷阱、多组数据处理注意事项等,最终成功通过所有测试点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题要非常细心才行,主要就是给定一些学生的数据,按照给定的指令输出想要的信息,但是这道题我卡了半天才过,具体发生了以下错误:

  • 由于c++中的string我非常习惯,而c语言中的char我非常讨厌,这道题我都是把char数组转换为string进行计算处理的。然而,在某个测试点超时了。这是因为我只注意了输入用scanf,没注意输出也要变为printf。
  • 我使用了strncpy函数进行字符串拷贝,然而我使用了该函数后,出现了拷贝过来的字符串长度比我想要的更长的现象,后来查询资料,发现这个函数是不会在末尾添加’\0’的,因此初始化数组的时候要注意这一点!
  • 我最后两个测试点一直WA,经过检查,是某个数组的初始化写的有问题,导致如果进行多组数据输入,就会出现错误的结论,这一点下次要格外注意!
  • 我的代码里针对了本来就不符合条件的数据,不进行计算直接输出结论的处理,但是这个处理对于这道题来说没啥用,可加可不加。
#include <iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<map>
#include<cstdlib>
#include<queue>
#include<cstring>
#include<set>
#include<list>
#include<unordered_set>
using namespace  std;
struct Card
{
    string level;
    int score;
    string site;
    string date;
    string name;
    string all;
};
struct Node
{
    int site;
    int num;
}node[1001];
Card a[10010];
int n,m;
bool cmp1(Node& x,Node& y)
{
    if(x.num!=y.num)
        return x.num>y.num;
    else return x.site<y.site;
}
bool cmp(Card& x,Card& y)
{
    if(x.score!=y.score)
        return x.score>y.score;
    else{
        return x.all<y.all;
    }
}
int sites[1100];
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        char temp[100];
        int d;
        scanf("%s%d",temp,&d);
        a[i].level=temp[0];
        a[i].score=d;

        char site[10]={'\0'},date[10]={'\0'},name[10]={'\0'};
        strncpy(site,temp+1,3);
        strncpy(date,temp+4,6);
        strncpy(name,temp+10,3);
        a[i].site=site;
        a[i].date=date;
        a[i].name=name;
        a[i].all=temp;

    }
   // for(int i=1;i<=n;i++)
    //    cout<<a[i].level<<" "<<a[i].site<<" "<<a[i].date<<" "<<a[i].score<<" "<<a[i].name<<endl;

     sort(a+1,a+n+1,cmp);
    for(int i=1;i<=m;i++){
        int opt;
        string term;
        char temp[20];
        scanf("%d%s",&opt,temp);
        term=temp;
       // cin>>opt>>term;
        printf("Case %d: %d %s\n",i,opt,term.c_str());
        if(opt==1)
        {
            if(term!="A"&&term!="B"&&term!="T")
            {
                cout<<"NA"<<endl;
                continue;
            }
            int flag=1;
            for(int j=1;j<=n;j++)
            {
                if(a[j].level==term)
                {
                    printf("%s %d\n",a[j].all.c_str(),a[j].score);
                    flag=0;
                }
            }
            if(flag==1)cout<<"NA"<<endl;
        }
        else if(opt==2)
        {
            int w=stoi(term);
            if(w<=100||w>=1000)
            {
                cout<<"NA"<<endl;
                continue;
            }
            int num=0,ans=0;
            for(int j=1;j<=n;j++)
                if(a[j].site==term)
                {
                    num++;
                    ans+=a[j].score;
                }
            if(num>0)
            {
                printf("%d %d\n",num,ans);
            }
            else
                printf("NA\n");
        }
        else if(opt==3)
        {
            fill(sites+1,sites+1000+10,0);
            for(int j=1;j<=n;j++)
            {
                if(a[j].date==term)
                {
                    int site_digit=stoi(a[j].site);
                    sites[site_digit]++;
                }
            }
            int cnt=0;
            for(int j=0;j<=1000;j++)
            {
                node[j].site=0;
                node[j].num=0;
            }
            for(int j=101;j<=999;j++)
                if(sites[j]>0)
                {
                    cnt++;
                    node[cnt].site=j;
                    node[cnt].num+=sites[j];
                }
            sort(node+1,node+cnt+1,cmp1);
            for(int j=1;j<=cnt;j++)
            {
                printf("%d %d\n",node[j].site,node[j].num);
            }
            if(cnt==0)
                printf("NA\n");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值