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;
 }