1095 解码PAT准考证(25)

分析

题意分析

此题题意清晰,这一道题实际上是由三道小题组成。
题1:将某个指定级别的考生的成绩按分数非升序输出,格式为“准考证号 成绩”。对于分数并列的考生,按其准考证号的字典序递增输出。
• 题2:将某指定考场的考生人数和总分统计按“人数 总分”的格式输出
题3:将某指定日期的考生人数分考场统计输出,输出按人数非递增顺序,格式为“考场编号 总人数”。若人数并列则按考场编号递增顺序输出。

关键点分析

题意的逻辑不算复杂,关键是选用什么结构来存储输出结果,用什么算法来对其进行排序。

  • 起初对于题1“准考证号 成绩”选用了map<string, int>来存储,可是发现algorithm库自带的sort函数只能对线性结构进行排序,故把map<string, int>改成了vector<pair<string, int>>,插入数据时仅需额外用make_pair函数组织数据即可。后来参考了别人的代码发现把map<string, int>直接改成struct node{string s; int value}也可解决sort函数只能对线性结构进行排序的问题。
  • 而对于题3将某指定日期的考生人数分考场统计输出则需要用到map<string, int>的唯一性来统计同一考场的考生人数,再对其进行排序。
  • 其次注意本题题1和3用得排序逻辑是一致的,故可共用一个cmp函数。
  • 另外,本题容易出现运行超时的情况,一些可加快运行时间的小技巧是把cin、cout改成scanf、printf,把map改成unorder_map,优化数据存储结构和代码判断逻辑。

一些小细节

  1. 把cout改成printf时,%s接收的数据类型是char*,故对string类型的数据s要改成s.c_str()。
  2. 题3用map统计同一考场的考生人数时,对符合日期的数据可用map[place]++来改变place对应考场的人数。
  3. 对container进行遍历可用for(auto it: container) 来简写

结果

在这里插入图片描述

代码

(实际上可再简化,可进一步减少代码量和存储空间,但是会降低可读性,故未进一步简化)

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>

using namespace std;

void gradedecreasinginclass(string requirement);
void peoplenumandtotalgradeinplace(string requirement);
void peoplenuminplaceondate(string requirement);
int cmp(const pair<string, int>& x, const pair<string, int>& y)  
{
     
    if(x.second == y.second)
    {
   
        return x.first < y.first;//从小到大排序
    }
	return x.second > y.second;  //从大到小排序
}

int peoplenum;
vector<string> idvector;
vector<string> classtypevector;
vector<string>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值