题目链接:点击查看

题目大意:给出n个学生的准考证号以及成绩,再给出m个查询,要求按照规则输出每一个查询

首先,准考证的构成也是有讲究的,每个准考证号由四部分组成:

  1. 第一位是级别,A代表甲级,B代表乙级,T代表顶级
  2. 第 2~4 位是考场编号,范围从 101 到 999;
  3. 第 5~10 位是考试日期,格式为年、月、日顺次各占 2 位;
  4. 最后 11~13 位是考生编号,范围从 000 到 999。

每次查询分为三种情况:类型+操作数

  1. 类型为1:操作数的含义为级别(A、B、T),要求首先按照成绩不严格降序,其次按照准考证升序输出指定级别的学生
  2. 类型为2:操作数的含义为考场号,输出该考场有多少个学生+该考场所有学生的总分数
  3. 类型为3:操作数的含义为考试日期,输出在该日期下的所有考场有多少学生,要求首先按照考场人数不严格降序,其次按照考场编号升序输出

若查询的目标为空,输出NA

题目分析:模拟即可,简单说一下思路:

  1. 对于操作1,我们用vector+pair辅助记录,在输入完后提前排好序,后续就能O(size)查询了
  2. 对于操作2,我们用pair辅助记录,在查询时就能直接O(1)查询
  3. 对于操作3,我们用map套map记录,外层记录日期,内层记录考场,这样等处理时,开一个vector把第二层map扔进去,排个序再输出就好了

直接看代码比较明了,注释写的很详细了

这里说一下我一开始被卡的一个小细节吧,一开始有两个样例过不去,后来比这网上别人的样例一一对照,发现日期可能有前导零,所以在输出的时候记得写成%06d才行

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e3+100;vector<pair<string,int>>ans1[3];//类型1 A:0,B:1,T:2 ans1[type][pos]=<学号,分数>bool cmp1(pair<string,int> a,pair<string,int> b)//对操作1进行排序
{if(a.second!=b.second)return a.second>b.second;return a.first<b.first;
}void type_1(string s,int val)//对操作1进行储存
{char ch=s[0];int pos;if(ch=='A')pos=0;else if(ch=='B')pos=1;elsepos=2;ans1[pos].push_back(make_pair(s,val));
}pair<int,int>ans2[N];//类型2 ans2[考场]=人数:分数 void type_2(string s,int score)//对操作2进行储存
{int pos=stoi(s.substr(1,3));ans2[pos].first++;ans2[pos].second+=score;
}unordered_map<int,unordered_map<int,int>>ans3;//类型3 ans3[日期][考场]=人数bool cmp3(pair<int,int> a,pair<int,int> b)//对操作3进行排序
{if(a.second!=b.second)return a.second>b.second;return a.first<b.first;
} void type_3(string s,int score)//对操作3进行储存
{int pos=stoi(s.substr(4,6));int temp=stoi(s.substr(1,3));ans3[pos][temp]++;
}int main()
{
//  freopen("input.txt","r",stdin);int n,m;scanf("%d%d",&n,&m);while(n--){string s;int score;cin>>s>>score;type_1(s,score);type_2(s,score);type_3(s,score);}for(int i=0;i<3;i++)//预处理一下操作1的排序,后续就能对操作1 O(size)查询了sort(ans1[i].begin(),ans1[i].end(),cmp1);for(int i=1;i<=m;i++){int op;scanf("%d",&op);if(op==1){char ch[5];scanf("%s",ch);printf("Case %d: %d %c\n",i,op,ch[0]);int pos;if(ch[0]=='A')pos=0;else if(ch[0]=='B')pos=1;elsepos=2;if(ans1[pos].size()){for(int j=0;j<ans1[pos].size();j++)printf("%s %d\n",ans1[pos][j].first.c_str(),ans1[pos][j].second);}elseprintf("NA\n");}else if(op==2){int num;scanf("%d",&num);printf("Case %d: %d %d\n",i,op,num);if(ans2[num].first)printf("%d %d\n",ans2[num].first,ans2[num].second);elseprintf("NA\n");}else{int num;scanf("%d",&num);printf("Case %d: %d %06d\n",i,op,num);//注意%06dif(ans3[num].empty())printf("NA\n");else{vector<pair<int,int>>ans;copy(ans3[num].begin(),ans3[num].end(),back_inserter(ans));sort(ans.begin(),ans.end(),cmp3);for(int j=0;j<ans.size();j++)printf("%d %d\n",ans[j].first,ans[j].second);}}}return 0;
}

PAT (Basic Level) 1095 解码PAT准考证(模拟+stl,好题)相关推荐

  1. PAT (Basic Level) 1091 N-自守数(模拟+stl)

    题目链接:点击查看 题目大意:给定一个数K,规定N-自守数的定义为K*K*N的末尾几位数等于K,则称K为N-自守数,比如3*92*92=25392,所以92是一个3-自守数,现在给出一些数,判断其是不 ...

  2. PAT (Basic Level) 1080 MOOC期终成绩(模拟+stl)

    题目链接:点击查看 题目大意:分别给出a个学生的编程分数,b个学生的期中考试成绩,c个学生的期末考试成绩,有几个规则: 总评为: 若期中考试成绩大于期末考试成绩: 否则: 合格的定义是编程分数大于等于 ...

  3. PAT basic level 答案+解题思路+难点 (个人刷题记录)

    PAT basic level 使用语言:C++ 仅记录一下自己刷题过程的心得体会 永远保持更新(期待更好的解法) 可能有些题没有(那就是我还没做出来,以后会更的!) 欢迎大家与我讨论交流√ 题目序列 ...

  4. PAT (Basic Level) 1075 链表元素分类(模拟)

    题目链接:点击查看 题目大意:初始时给出一个链表,需要按照要求排序: 当结点中的值为负数时,需要排在最前面 当结点中的值为非负数且小于阈值k时,排在中间 当结点中的值大于阈值k时,排在最后 在整体排序 ...

  5. PAT (Basic Level) 1035 插入与归并(模拟)

    题目链接:点击查看 题目大意:给出两列数字,问第二列数是由第一列数怎样排序得到的,题目保证答案唯一,并且只有归并排序或插入排序两种选择 题目分析:因为一开始不太了解归并排序和插入排序的特点,所以有点无 ...

  6. PAT (Basic Level) Practice (中文)1095 解码PAT准考证 (25 分)

    PAT (Basic Level) Practice (中文)1095 解码PAT准考证 (25 分) PAT 准考证号由 4 部分组成: 第 1 位是级别,即T代表顶级:A代表甲级:B代表乙级: 第 ...

  7. 1095 解码PAT准考证

    1095 解码PAT准考证 题目: PAT 准考证号由 4 部分组成: 第 1 位是级别,即 T 代表顶级:A 代表甲级:B 代表乙级: 第 2~4 位是考场编号,范围从 101 到 999: 第 5 ...

  8. 1095 解码PAT准考证 (25分)击破测试点3、4,50ms内通关

    1095 解码PAT准考证 (25分)测试点34用时低于35ms 前言 一.题目简介 二.原题内容 1. 设定 2. 输入格式 3. 输出格式 三.题目分析 1. 要求1分析 2. 要求2分析 3. ...

  9. PAT (Basic Level) Practice (中文)答案合集

    准备复试专用,目标刷完全部中文题! 1001 害死人不偿命的(3n+1)猜想 (15 分) 卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 ...

最新文章

  1. ElasticSearch(3)-安装kibana
  2. SIFT中LoG和DoG比较
  3. php的web能力,web 性能的几个概念。
  4. java 异常抛出空指针异常_java.lang.NullPointerException 抛出空指针异常
  5. mongoose-iot_如何使用带有ESP32和Mongoose OS的GCP-Cloud IoT核心版查看天气
  6. 光线求交加速算法:边界体积层次结构(Bounding Volume Hierarchies)2-表面积启发式法(The Surface Area Heuristic)
  7. 20190915:(leetcode习题)对称二叉树
  8. 从零开始刷Leetcode——数组(66.88)
  9. 美团点评 2019校园招聘 后台开发方向职位编程题-2018.09.06
  10. 你知道你的手机上有哪些传感器吗?
  11. 幼儿课外活动游戏_幼儿园户外活动游戏大全
  12. C#中如何使用Chart图表
  13. 表单form中的submit事件
  14. 百度地图大量点卡顿问题解决办法。
  15. 4g模块与51单片机通信
  16. 前后端分离电商B2C模式之_后台_购物车
  17. 使用.NET 将PDF转成Word
  18. 【深圳VS台湾】真正的无人驾驶还要等75年?在台湾已运行大半年(附台湾和深圳无人驾驶公交对比表)...
  19. 【重磅新闻】罗永浩约战王自如:一场两败俱伤的战役!
  20. 全志科技T3开发板(4核ARM Cortex-A7)——视频开发案例

热门文章

  1. MySQL高级 - NULL值的判定
  2. Java虚拟机对synchronized的优化
  3. 再述autowiring
  4. IOC 容器初始化小结
  5. 在vs code中创建代码片段
  6. 结合zuul网关的鉴权流程
  7. mac 由于网络问题,您已断开与 windows 计算机的联接.,苹果电脑启用windows系统时连接不上无线网怎么处理?...
  8. linux svn配置教程,linux svn搭建及配置
  9. 静态内存、动态内存与堆栈
  10. 彻底卸载WinStdup