题目链接:1095 解码PAT准考证
#include <iostream>
#include <vector>
#include <unordered_map>
#include <string>
#include <algorithm>
using namespace std;
struct Stu{
string id;
int sco;
};
int cmp(Stu &s1, Stu &s2){
if(s1.sco == s2.sco) return s1.id < s2.id;
return s1.sco > s2.sco;
}
int main(){
int N, M , a, b;
string s;
char c[7];
cin >> N >> M;
Stu stu[N];
for(int i=0;i<N;i++) cin >> stu[i].id >> stu[i].sco;
for(int i=0;i<M;i++){
scanf("%d %s", &a, c);
printf("Case %d: %d %s\n",i+1,a,c);
if(a == 1){
vector<Stu> v;
for(int j=0;j<N;j++){
if(stu[j].id[0] == c[0]) v.push_back(stu[j]);
}
sort(v.begin(),v.end(),cmp);
if(v.size()==0){
printf("NA\n");
continue;
}
for(int j=0;j<v.size();j++) printf("%s %d\n",v[j].id.c_str(), v[j].sco);
}
else if(a == 2){
sscanf(c,"%d",&b);
int num = 0 ,sco = 0;
for(int j=0;j<N;j++){
if(b == stoi(stu[j].id.substr(1,3))){
num++;
sco += stu[j].sco;
};
}
if(num==0){
printf("NA\n");
continue;
}
printf("%d %d\n", num, sco);
}
else if(a == 3){
sscanf(c,"%d",&b);
unordered_map<string,int> mp;
for(int j=0;j<N;j++){
if(stoi(stu[j].id.substr(4,6))==b){
mp[stu[j].id.substr(1,3)]++;
}
}
if(mp.size()==0){
printf("NA\n");
continue;
}
vector<Stu> vs;
for(auto it: mp) vs.push_back({it.first,it.second});
sort(vs.begin(),vs.end(),cmp);
for(int j=0;j<vs.size();j++){
printf("%s %d\n", vs[j].id.c_str(), vs[j].sco);
}
}
}
}