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

题目链接:点击查看

题目大意:给出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
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
 
typedef long long LL;
 
const int inf=0x3f3f3f3f;
 
const int N=1e3+100;

vector>ans1[3];//类型1 A:0,B:1,T:2 ans1[type][pos]=<学号,分数>

bool cmp1(pair a,pair b)//对操作1进行排序
{
	if(a.second!=b.second)
		return a.second>b.second;
	return a.firstans2[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>ans3;//类型3 ans3[日期][考场]=人数

bool cmp3(pair a,pair b)//对操作3进行排序
{
	if(a.second!=b.second)
		return a.second>b.second;
	return a.first>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;
			else
				pos=2;
			if(ans1[pos].size())
			{
				for(int j=0;j>ans;
				copy(ans3[num].begin(),ans3[num].end(),back_inserter(ans));
				sort(ans.begin(),ans.end(),cmp3);
				for(int j=0;j

 

你可能感兴趣的:(模拟,PAT乙级,模拟)