PAT_A1153
PAT甲级1153.
目录
A1153
题目
样例
输入:
8 4
B123180908127 99
B102180908003 86
A112180318002 98
T107150310127 62
A107180908108 100
T123180908010 78
B112160918035 88
A107180908021 98
1 A
2 107
3 180908
2 999
输出:
Case 1: 1 A
A107180908108 100
A107180908021 98
A112180318002 98
Case 2: 2 107
3 260
Case 3: 3 180908
107 2
123 2
102 1
Case 4: 2 999
NA
思路和坑点
思路:
排序并按照查询类型遍历整个数据,然后将需要的数据输出。
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef struct{ //学生结构体
string id;
int score;
}ST;
bool cmp(ST a,ST b){ //排序规则
if(a.score!=b.score) return a.score>b.score;
else return a.id<b.id;
}
int main(void){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n,m,case_tp; //case_tp表示查验类型
string temp,day,room; //临时变量,时间,考场
cin>>n>>m;
vector<ST> v(n),ans; //v用于存储数据,ans用于存放答案
for(int i=0;i<n;i++)
cin>>v[i].id>>v[i].score; //读入原始数据
for(int i=1;i<=m;i++){ //进行查验
int cnt=0; //用于输出个数
cin>>case_tp>>temp; //读入查验类型和查验参数
cout<<"Case "<<i<<": "<<case_tp<<' '<<temp<<'\n';
ans.clear(); //初始化ans数组
if(case_tp==1){ //第一种类型
for(int j=0;j<n;j++) //找到同一个级别的考生放入输出的数组中
if(v[j].id[0]==temp[0]) ans.push_back(v[j]);
sort(ans.begin(),ans.end(),cmp); //按照要求排序并输出
for(int j=0;j<ans.size();j++){
cout<<ans[j].id<<' '<<ans[j].score<<'\n';
cnt++;
}
}
else if(case_tp==2){ //第二种类型
int sum=0,num=0; //用于统计总人数和总分分数
for(int j=0;j<n;j++){
room=v[j].id.substr(1,3); //遍历原始数据获取每个考生的考场号
if(room==temp){ //如果和查验的考场号相同,则累计人数和总分
num++;
sum+=v[j].score;
}
}
if(num) {printf("%d %d\n",num,sum);cnt++;} //当人数不为0时,输出并把标记cnt+1
}
else{
unordered_map<string,int> mp; //创建考场和人数的对应关系
for(int j=0;j<n;j++){ //遍历数据,获取考试日期和考场号
day=v[j].id.substr(4,6);
room=v[j].id.substr(1,3);
if(day==temp) //对应考场的人数统计+1
mp[room]++;
}
ST t; //这里发现如果把人数放在学生分数位置,考场号放在准考证号位置,两者排序规则相同,所以用于借用
for(auto it=mp.begin();it!=mp.end();it++){ //把考场号和人数组成结构体放入输出的数组中
t.id=it->first; t.score=it->second;
ans.push_back(t);
}
sort(ans.begin(),ans.end(),cmp); //按照要求排序后输出
for(int j=0;j<ans.size();j++){
cout<<ans[j].id<<' '<<ans[j].score<<'\n';
cnt++;
}
}
if(cnt==0) puts("NA"); //如果当前类型没有输出,则查询结果为空,输出NA
}
return 0;
}