天天看点

PAT Basic Level 1095 解码PAT准考证 (25 分)

题目链接:

https://pintia.cn/problem-sets/994805260223102976/problems/1071786104348536832

我的15分代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <unordered_map>
#include <vector>
#include <string>
#include <cstring>
using namespace std;

const int maxn=10010;
struct person{
    string number;
    int score;
}per[maxn],Rank_per[maxn];

unordered_map<int,int> pers;
struct TEMP{
    int kaochange,renshu;
}tmp[maxn];

bool cmp(struct person a,struct person b){
    if(a.score!=b.score)    return a.score>b.score;
    else    return a.number<b.number;
}

bool cmp_(struct TEMP a,struct TEMP b){
    if(a.renshu!=b.renshu)  return a.renshu>b.renshu;
    else    return a.kaochange<b.kaochange;
}

int main(){
    int N,M;
    scanf("%d%d",&N,&M);
    for(int i=0;i<N;i++){
        cin>>per[i].number;
        scanf("%d",&per[i].score);
        getchar();
    }
//    for(int i=0;i<N;i++){
//        cout<<per[i].number<<" "<<per[i].score<<endl;
//    }

    int cishu=1;
    while(M--){
        int number;
        scanf("%d",&number);
        getchar();
        if(number==1){
            char Rank;
            scanf("%c",&Rank);
            int i=0,j=0;
            for(;i<N;i++){
                if(per[i].number[0]==Rank){
                    Rank_per[j].number=per[i].number;
                    Rank_per[j].score=per[i].score;
                    j++;
                }
            }
            sort(Rank_per,Rank_per+j,cmp);
            printf("Case %d: %d %c\n",cishu,number,Rank);
            for(int k=0;k<j;k++){
                cout<<Rank_per[k].number;
                printf(" %d\n",Rank_per[k].score);
            }
            cishu++;
        }
        else if(number==2){
            int kaochang;
            scanf("%d",&kaochang);
            int people=0;//人数
            int tolscore=0;//总分
            for(int i=0;i<N;i++){
                string str=per[i].number.substr(1,3);
                int a=atoi(str.c_str());
                if(a==kaochang){
                people++;
                tolscore+=per[i].score;
                }
            }
            printf("Case %d: %d %03d\n",cishu,number,kaochang);//测试点4,注意%03d格式
            if(people)
            printf("%d %d\n",people,tolscore);
            else//查询为空
            printf("NA\n");
            cishu++;
        }
        else{
            int date;
            scanf("%d",&date);

            for(int i=0;i<N;i++){
                string str=per[i].number.substr(4,6);
                int b=atoi(str.c_str());
                if(b==date){
                    string str=per[i].number.substr(1,3);
                    int a=atoi(str.c_str());
                    pers[a]++;
                }
            }
            int w=0;
            for(unordered_map<int,int>::iterator it=pers.begin();it!=pers.end();it++){
                tmp[w].kaochange=it->first;
                tmp[w].renshu=it->second;
                w++;
            }
            sort(tmp,tmp+w,cmp_);
            printf("Case %d: %d %06d\n",cishu,number,date);//测试点4,注意%06d格式
            if(w){
                for(int l=0;l<w;l++){
                    printf("%d %d\n",tmp[l].kaochange,tmp[l].renshu);
                }
            }
            else{
                printf("NA\n");
            }
            cishu++;
        }

    }
}
           

AC代码:

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <string>
using namespace std;
struct node {
	string t;
	int value;
};

bool cmp(const node &a, const node &b) {
	return a.value != b.value ? a.value > b.value : a.t < b.t;
}
int main() {
    int n, k, num;
    string s;
    cin >> n >> k;
    vector<node> v(n);
    for (int i = 0; i < n; i++)
        cin >> v[i].t >> v[i].value;
    for (int i = 1; i <= k; i++) {
        cin >> num >> s;
        printf("Case %d: %d %s\n", i, num, s.c_str());
	vector<node> ans;
	int cnt = 0, sum = 0;
	if (num == 1) {
            for (int j = 0; j < n; j++)
		if (v[j].t[0] == s[0]) ans.push_back(v[j]);
	}
	else if (num == 2) {
	    for (int j = 0; j < n; j++) {
		if (v[j].t.substr(1, 3) == s) {
			cnt++;
			sum += v[j].value;
		}

	    }
            if (cnt != 0) printf("%d %d\n", cnt, sum);
        }
	else if (num == 3) {
	    unordered_map<string, int> m;
	    for (int j = 0; j < n; j++)
		if (v[j].t.substr(4, 6) == s) m[v[j].t.substr(1, 3)]++;
	    for (auto it : m) ans.push_back({ it.first, it.second });
	}
	sort(ans.begin(), ans.end(), cmp);
	for (int j = 0; j < ans.size(); j++) printf("%s %d\n", ans[j].t.c_str(), ans[j].value);
	if (((num == 1 || num == 3) && ans.size() == 0) || (num == 2 && cnt == 0)) printf("NA\n");
    }
    return 0;
}