PAT A1153 Decode Registration Card of PAT【排序】

2020-08-12 18:22:03

這道題要非常細心才行,主要就是給定一些學生的數據,按照給定的指令輸出想要的資訊,但是這道題我卡了半天才過,具體發生了以下錯誤:

  • 由於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");
        }
    }
}