【PAT乙级、C++简单写法】1095 解码PAT准考证 (25分)

下面是我遇到的坑:

  • 能用printf就不要用cout
  • 不要用map用unordered_map
  • 每个指令的空数据的情况都要考虑到并输出NA
  • 使用swich case的格式的话记得在default情况输出NA
  • 不能用char作为实参传递给string类型的形参
  • sort函数不能对map进行排序
  • 是先输入N再输入M,而不是按照字母表的顺序先输入M再输入N(反正我是在初始化vector的时候被坑了)
# include <iostream>
# include <vector>
# include <algorithm>
# include <unordered_map>

using namespace std;

// 这个比较函数可以满足指令1和3的排序规则
bool cmp(pair<string, int> & x, pair<string, int> & y)
{
    return x.second != y.second ? x.second > y.second : x.first < y.first;
}


// 类型 为 1 的指令,输出格式与输入的考生信息格式相同,即 准考证号 成绩。
// 对于分数并列的考生,按其准考证号的字典序递增输出(题目保证无重复准考证号);
void showLevel(string level, vector<pair<string, int>> & infos)
{
    vector<pair<string, int>> v;
    
    for(auto i : infos)
        if(i.first[0] == level[0])
            v.push_back(i);
    
    sort(v.begin(), v.end(), cmp);
          
    // 空数据输出NA,非空则按格式输出
    if(v.size() == 0)
        printf("NA\n");
    else
        for(auto i : v)
            printf("%s %d\n",i.first.c_str(), i.second);
}

// 类型 为 2 的指令,按 人数 总分 的格式输出
void showRoom(string room, vector<pair<string, int>> & infos)
{
    int cnt = 0;
    int sum = 0;
    
    for(auto i : infos)
        if(i.first.substr(1, 3) == room){
            cnt++;
            sum += i.second;
        }
    
    // 空数据输出NA,非空则按格式输出
    if(cnt == 0)
        printf("NA\n");
    else
        printf("%d %d\n", cnt, sum);
}

// 类型 为 3 的指令,输出按人数非递增顺序,格式为 考场编号 总人数。
// 若人数并列则按考场编号递增顺序输出。
void showDate(string date, vector<pair<string, int>> & infos)
{
    unordered_map<string, int> m;
    
    for(auto i : infos)
        if(i.first.substr(4, 6) == date)
            m[i.first.substr(1, 3)]++;
    
    // 因为sort函数不能用于map,所以将其放入vector中进行排序    
    vector<pair<string, int>> v(m.begin(), m.end());
    sort(v.begin(), v.end(), cmp);
          
    // 空数据输出NA,非空则按格式输出
    if(m.size() == 0)
        printf("NA\n");
    else
        for(auto i : v)
            printf("%s %d\n", i.first.c_str(), i.second);
}

int main(void)
{
    int N, M;
    cin >> N >> M;

	// 输入
    vector<pair<string, int>> infos(N);  // 存放考生信息 infos[i].first是准考证号 infos[i].second是考生成绩
    vector<pair<int, string>> comds(M);  // 存放指令 comds[i].first是指令类型 comds[i].second是指令
    for(int i=0;i<N;++i)
        cin >> infos[i].first >> infos[i].second;
    for(int i=0;i<M;++i)
        cin >> comds[i].first >> comds[i].second;
    
    // 遍历指令
    for(int i=0;i<M;i++)
    {
        printf("Case %d: %d %s\n", i+1, comds[i].first, comds[i].second.c_str());
        
        switch(comds[i].first)
        {
            case 1:
                showLevel(comds[i].second, infos);
                break;
            case 2:
                showRoom(comds[i].second, infos);
                break;
            case 3:
                showDate(comds[i].second, infos);
                break;
            default:
                printf("NA");
                break;
        }
    }
    
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值