半个月了,每天做几道题PAT基础题,终于把基础的95道题目做完了。总体来说,没有太难的东西,偶尔几个题目有点复杂而已。

  加油,离3月份的考试越来越近了,还有155道题目等着我呢!!!

B_1095题目如下:

1095 解码PAT准考证 (25 分)

PAT 准考证号由 4 部分组成:

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

现给定一系列考生的准考证号和他们的成绩,请你按照要求输出各种统计信息。

输入格式:

输入首先在一行中给出两个正整数 N(≤10​4​​)和 M(≤100),分别为考生人数和统计要求的个数。

接下来 N 行,每行给出一个考生的准考证号和其分数(在区间 [0,100] 内的整数),其间以空格分隔。

考生信息之后,再给出 M 行,每行给出一个统计要求,格式为:类型 指令,其中

  • 类型 为 1 表示要求按分数非升序输出某个指定级别的考生的成绩,对应的 指令 则给出代表指定级别的字母;
  • 类型 为 2 表示要求将某指定考场的考生人数和总分统计输出,对应的 指令 则给出指定考场的编号;
  • 类型 为 3 表示要求将某指定日期的考生人数分考场统计输出,对应的 指令 则给出指定日期,格式与准考证上日期相同。

输出格式:

对每项统计要求,首先在一行中输出 Case #: 要求,其中 # 是该项要求的编号,从 1 开始;要求 即复制输入给出的要求。随后输出相应的统计结果:

  • 类型 为 1 的指令,输出格式与输入的考生信息格式相同,即 准考证号 成绩。对于分数并列的考生,按其准考证号的字典序递增输出(题目保证无重复准考证号);
  • 类型 为 2 的指令,按 人数 总分 的格式输出;
  • 类型 为 3 的指令,输出按人数非递增顺序,格式为 考场编号 总人数。若人数并列则按考场编号递增顺序输出。

如果查询结果为空,则输出 NA

输入样例:

8 4
B123180908127 99
B102180908003 86
A112180318002 98
T107150310127 62
A107180908108 100
T123180908010 78
B112160918035 88
A107180908021 98
1 A
2 107
3 180908
2 999

输出样例:

Case 1: 1 A
A107180908108 100
A107180908021 98
A112180318002 98
Case 2: 2 107
3 260
Case 3: 3 180908
107 2
123 2
102 1
Case 4: 2 999
NA
思路:根据要求输出的三个指令,选择数据的存储方式。
  指令1:1.可以通过map容器存储,map<string,vector<studata> >
    键值string为('A'、'B'、'T') studata数据类型存储学生准考证号和成绩
      2.也可以直接通过三个vector存储   
               vector<studata> levelTStu;
                vector<studata> levelAStu;
                vector<studata> levelBStu;
  指令2:可直接用两个数组存储,examRoomCnt[1000] = {0},examRoomResult[1000] = {0}
      分别存储考场人数和考场总成绩。(也可用map容器)
  指令3:用双重unordered_map图存储,相对map来说,查询速度比较块。
    unordered_map<int, unordered_map<int, examroom> > dateExamData;
    第一个int为六位数的日期,也可以用string类型;
    第二个int为考场号,统计相应考场学生人数时使用;
    examroom存储考场号和考场人数。
这样存储后,输出就很简单了,只需要按照要求进行一定的排序后,就可以直接输出。 代码如下:
 #include <iostream>
#include <stdio.h>
#include <vector>
#include <unordered_map>
#include <string>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std;
/*
1.Level --> id/score sort
solve:vector + struct -> sort -> output
2.ExamRoom --> peopleCnt/scoreSum
solve:Array + int -> plus
3.Date --> ExamRoom/people + sort
solve:map + int + vector
*/
typedef struct STUDATA
{
char id[];
int result;
}studata;
typedef struct EXAMROOMID
{
int id;
int cnt=;
}examroom;
bool CmpStuData(studata a, studata b)
{
if(a.result != b.result)
{
return a.result > b.result;
}
else if(a.id != b.id)
{
return strcmp(a.id, b.id) < ;
}
return false;
}
bool CmpExamRoom(examroom a, examroom b)
{
if(a.cnt != b.cnt)
{
return a.cnt > b.cnt;
}
else if(a.id != b.id)
{
return a.id < b.id;
}
return false;
}
int main()
{
//指令1数据存储
vector<studata> levelTStu;
vector<studata> levelAStu;
vector<studata> levelBStu;
//指令2数据存储
int N,M,examRoomCnt[] = {},examRoomResult[] = {};
//指令3数据存储
unordered_map<int, unordered_map<int, examroom> > dateExamData; studata tempStuData;
examroom tempExamroom;
char examRoomId[] = {};
char examDateStr[] = {}; scanf("%d %d", &N, &M);
//数据读入
while(N--)
{
scanf("%s",tempStuData.id);
scanf("%d", &tempStuData.result);
//指令1
if(tempStuData.id[] == 'A')
{
levelAStu.push_back(tempStuData);
}
else if(tempStuData.id[] == 'B')
{
levelBStu.push_back(tempStuData);
}
else
{
levelTStu.push_back(tempStuData);
}
//指令2
strncpy(examRoomId, tempStuData.id + , );
int examRoom = atoi(examRoomId);
++ examRoomCnt[examRoom];
examRoomResult[examRoom] += tempStuData.result;
//指令3
strncpy(examDateStr, tempStuData.id + , );
int examDate = atoi(examDateStr);
dateExamData[examDate][examRoom].id = examRoom;
++ dateExamData[examDate][examRoom].cnt;
}
// cout << "Data entered over" << endl;
int tempCmd;
char cmdStr[] = {};
int cmdCnt = ;
//指令读入
while(M--)
{
memset(cmdStr,,sizeof(cmdStr));
scanf("%d %s", &tempCmd, cmdStr);
++ cmdCnt;
printf("Case %d: %d %s\n", cmdCnt, tempCmd, cmdStr);
bool outputFlag = false;
if(tempCmd == )
{
if(cmdStr[] == 'A')
{
sort(levelAStu.begin(), levelAStu.end(), CmpStuData);
for(int i = ; i < levelAStu.size(); ++ i)
{
outputFlag = true;
printf("%s %d\n", levelAStu[i].id, levelAStu[i].result);
}
}
else if(cmdStr[] == 'T')
{
sort(levelTStu.begin(), levelTStu.end(), CmpStuData);
for(int i = ; i < levelTStu.size(); ++ i)
{
outputFlag = true;
printf("%s %d\n", levelTStu[i].id, levelTStu[i].result);
}
}
else
{
sort(levelBStu.begin(), levelBStu.end(), CmpStuData);
for(int i = ; i < levelBStu.size(); ++ i)
{
outputFlag = true;
printf("%s %d\n", levelBStu[i].id, levelBStu[i].result);
}
}
}
else if(tempCmd == )
{
strncpy(examRoomId,cmdStr,);
int examRoom = atoi(examRoomId);
if(examRoomCnt[examRoom] > )
{
outputFlag = true;
printf("%d %d\n", examRoomCnt[examRoom], examRoomResult[examRoom]);
}
}
else if(tempCmd == )
{
strncpy(examDateStr,cmdStr,);
int examDate = atoi(examDateStr);
unordered_map<int, examroom> tempDateExamData = dateExamData[examDate];
examroom tempExamroomArray[tempDateExamData.size()];
if(tempDateExamData.size() > )
{
outputFlag = true;
int i = -;
for(auto it = tempDateExamData.begin(); it != tempDateExamData.end(); ++ it)
{
tempExamroomArray[++i] = it->second;
}
sort(tempExamroomArray, tempExamroomArray+tempDateExamData.size(), CmpExamRoom);
for(i = ; i < tempDateExamData.size(); ++ i)
{
printf("%d %d\n", tempExamroomArray[i].id, tempExamroomArray[i].cnt);
}
}
}
if(!outputFlag)
{
printf("NA\n");
}
}
return ;
}

PAT B1095 解码PAT准考证的更多相关文章

  1. PAT甲 1095 解码PAT准考证/1153 Decode Registration Card of PAT(优化技巧)

    1095 解码PAT准考证/1153 Decode Registration Card of PAT(25 分) PAT 准考证号由 4 部分组成: 第 1 位是级别,即 T 代表顶级:A 代表甲级: ...

  2. P1095 解码PAT准考证

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

  3. 1095 解码PAT准考证

    PAT 准考证号由 4 部分组成: 第 1 位是级别,即 T 代表顶级:A 代表甲级:B 代表乙级: 第 2~4 位是考场编号,范围从 101 到 999: 第 5~10 位是考试日期,格式为年.月. ...

  4. 1095 解码PAT准考证 (25 分)

    PAT 准考证号由 4 部分组成: 第 1 位是级别,即 T 代表顶级:A 代表甲级:B 代表乙级: 第 2~4 位是考场编号,范围从 101 到 999: 第 5~10 位是考试日期,格式为年.月. ...

  5. PAT Basic 1095 解码PAT准考证 (25 分)

    PAT 准考证号由 4 部分组成: 第 1 位是级别,即 T 代表顶级:A 代表甲级:B 代表乙级: 第 2~4 位是考场编号,范围从 101 到 999: 第 5~10 位是考试日期,格式为年.月. ...

  6. PAT(B) 1085 PAT单位排行(Java:20分)

    题目链接:1085 PAT单位排行 (25 point(s)) 题目描述 每次 PAT 考试结束后,考试中心都会发布一个考生单位排行榜.本题就请你实现这个功能. 输入格式 输入第一行给出一个正整数 N ...

  7. PAT Basic 1085 PAT单位排行 (25 分)

    每次 PAT 考试结束后,考试中心都会发布一个考生单位排行榜.本题就请你实现这个功能. 输入格式: 输入第一行给出一个正整数 N(≤),即考生人数.随后 N 行,每行按下列格式给出一个考生的信息: 准 ...

  8. 【算法学习记录-排序题】【PAT A1025】PAT Ranking

    Programming Ability Test (PAT) is organized by the College of Computer Science and Technology of Zhe ...

  9. 【PAT】1025. PAT Ranking (25)

    题目链接:http://pat.zju.edu.cn/contests/pat-a-practise/1025 题目描述: Programming Ability Test (PAT) is orga ...

随机推荐

  1. 吴裕雄--天生自然java开发常用类库学习笔记:Map接口

    import java.util.HashMap ; import java.util.Map ; public class HashMapDemo01{ public static void mai ...

  2. JuJu团队11月28号工作汇报

    JuJu团队11月28号工作汇报 JuJu   Scrum 团队成员 今日工作 剩余任务 困难 于达 解决了数据接口的bug 生成generator形式, 并用熟悉Julia处理数据的方法 处理数据步 ...

  3. python --- mysql数据库的操作

    1.pymysql的初使用 import pymysql db_config = { 'host' :'127.0.0.1', 'user':'root', ', , 'database':'test ...

  4. Mac 配置代码高亮 Git状态显示

    Mac 一个为开发者量身定做的笔记本,分享给大家希望能帮助大家配置一个好的开发环境,好的开发环境才有好的心情Code. 首先进入到Home到目录一般默认打开的都是Home,如果不是输入 cd ~ 回车 ...

  5. POJ 3250:Bad Hair Day 好玩的单调栈

    Bad Hair Day Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15699   Accepted: 5255 Des ...

  6. Rabbitmq之高级特性——百分百投递消息&消息确认模式&消息返回模式实现

    rabbitmq的高级特性: 如何保障消息的百分之百成功? 要满足4个条件:生产方发送出去,消费方接受到消息,发送方接收到消费者的确认信息,完善的消费补偿机制 解决方案,1)消息落库,进行消息状态打标 ...

  7. Docker部署Python应用程序

    Docker部署Python应用程序 1. 单个py文件部署 生成Dockerfile 文件 插件用的豆瓣的镜像,,重置时间(容器的默认时间是UTC时间与宿主机的相差8小时). 文中需要三个插件(pe ...

  8. 修改ssh主机名

    三台机器的配置相似,以zk1为例 1.修改hostname vi /etc/hostname zk1 2.修改hosts文件 vi /etc/hosts 10.45.48.233 zk1 10.45. ...

  9. Elasticsearch 更新文档

    章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...

  10. vue学习(五)生命周期 的钩子函数

    生命周期的钩子函数 主要有以下几种 beforeCreate created beforeMount mounted beforeUpdate updated activated deactivate ...