PAT (Basic Level) 1095 解码PAT准考证(模拟+stl,好题)
题目链接:点击查看
题目大意:给出n个学生的准考证号以及成绩,再给出m个查询,要求按照规则输出每一个查询
首先,准考证的构成也是有讲究的,每个准考证号由四部分组成:
- 第一位是级别,A代表甲级,B代表乙级,T代表顶级
- 第 2~4 位是考场编号,范围从 101 到 999;
- 第 5~10 位是考试日期,格式为年、月、日顺次各占 2 位;
- 最后 11~13 位是考生编号,范围从 000 到 999。
每次查询分为三种情况:类型+操作数
- 类型为1:操作数的含义为级别(A、B、T),要求首先按照成绩不严格降序,其次按照准考证升序输出指定级别的学生
- 类型为2:操作数的含义为考场号,输出该考场有多少个学生+该考场所有学生的总分数
- 类型为3:操作数的含义为考试日期,输出在该日期下的所有考场有多少学生,要求首先按照考场人数不严格降序,其次按照考场编号升序输出
若查询的目标为空,输出NA
题目分析:模拟即可,简单说一下思路:
- 对于操作1,我们用vector+pair辅助记录,在输入完后提前排好序,后续就能O(size)查询了
- 对于操作2,我们用pair辅助记录,在查询时就能直接O(1)查询
- 对于操作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,好题)相关推荐
- PAT (Basic Level) 1091 N-自守数(模拟+stl)
题目链接:点击查看 题目大意:给定一个数K,规定N-自守数的定义为K*K*N的末尾几位数等于K,则称K为N-自守数,比如3*92*92=25392,所以92是一个3-自守数,现在给出一些数,判断其是不 ...
- PAT (Basic Level) 1080 MOOC期终成绩(模拟+stl)
题目链接:点击查看 题目大意:分别给出a个学生的编程分数,b个学生的期中考试成绩,c个学生的期末考试成绩,有几个规则: 总评为: 若期中考试成绩大于期末考试成绩: 否则: 合格的定义是编程分数大于等于 ...
- PAT basic level 答案+解题思路+难点 (个人刷题记录)
PAT basic level 使用语言:C++ 仅记录一下自己刷题过程的心得体会 永远保持更新(期待更好的解法) 可能有些题没有(那就是我还没做出来,以后会更的!) 欢迎大家与我讨论交流√ 题目序列 ...
- PAT (Basic Level) 1075 链表元素分类(模拟)
题目链接:点击查看 题目大意:初始时给出一个链表,需要按照要求排序: 当结点中的值为负数时,需要排在最前面 当结点中的值为非负数且小于阈值k时,排在中间 当结点中的值大于阈值k时,排在最后 在整体排序 ...
- PAT (Basic Level) 1035 插入与归并(模拟)
题目链接:点击查看 题目大意:给出两列数字,问第二列数是由第一列数怎样排序得到的,题目保证答案唯一,并且只有归并排序或插入排序两种选择 题目分析:因为一开始不太了解归并排序和插入排序的特点,所以有点无 ...
- PAT (Basic Level) Practice (中文)1095 解码PAT准考证 (25 分)
PAT (Basic Level) Practice (中文)1095 解码PAT准考证 (25 分) PAT 准考证号由 4 部分组成: 第 1 位是级别,即T代表顶级:A代表甲级:B代表乙级: 第 ...
- 1095 解码PAT准考证
1095 解码PAT准考证 题目: PAT 准考证号由 4 部分组成: 第 1 位是级别,即 T 代表顶级:A 代表甲级:B 代表乙级: 第 2~4 位是考场编号,范围从 101 到 999: 第 5 ...
- 1095 解码PAT准考证 (25分)击破测试点3、4,50ms内通关
1095 解码PAT准考证 (25分)测试点34用时低于35ms 前言 一.题目简介 二.原题内容 1. 设定 2. 输入格式 3. 输出格式 三.题目分析 1. 要求1分析 2. 要求2分析 3. ...
- PAT (Basic Level) Practice (中文)答案合集
准备复试专用,目标刷完全部中文题! 1001 害死人不偿命的(3n+1)猜想 (15 分) 卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 ...
最新文章
- ElasticSearch(3)-安装kibana
- SIFT中LoG和DoG比较
- php的web能力,web 性能的几个概念。
- java 异常抛出空指针异常_java.lang.NullPointerException 抛出空指针异常
- mongoose-iot_如何使用带有ESP32和Mongoose OS的GCP-Cloud IoT核心版查看天气
- 光线求交加速算法:边界体积层次结构(Bounding Volume Hierarchies)2-表面积启发式法(The Surface Area Heuristic)
- 20190915:(leetcode习题)对称二叉树
- 从零开始刷Leetcode——数组(66.88)
- 美团点评 2019校园招聘 后台开发方向职位编程题-2018.09.06
- 你知道你的手机上有哪些传感器吗?
- 幼儿课外活动游戏_幼儿园户外活动游戏大全
- C#中如何使用Chart图表
- 表单form中的submit事件
- 百度地图大量点卡顿问题解决办法。
- 4g模块与51单片机通信
- 前后端分离电商B2C模式之_后台_购物车
- 使用.NET 将PDF转成Word
- 【深圳VS台湾】真正的无人驾驶还要等75年?在台湾已运行大半年(附台湾和深圳无人驾驶公交对比表)...
- 【重磅新闻】罗永浩约战王自如:一场两败俱伤的战役!
- 全志科技T3开发板(4核ARM Cortex-A7)——视频开发案例