PAT B1095 解码PAT准考证

  半个月了,每天做几道题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存储考场号和考场人数。这样存储后,输出就很简单了,只需要按照要求进行一定的排序后,就可以直接输出。

代码如下:
  1 #include <iostream>
  2 #include <stdio.h>
  3 #include <vector>
  4 #include <unordered_map>
  5 #include <string>
  6 #include <stdlib.h>
  7 #include <string.h>
  8 #include <algorithm>
  9 using namespace std;
 10 /*
 11 1.Level --> id/score sort
 12     solve:vector + struct -> sort -> output
 13 2.ExamRoom --> peopleCnt/scoreSum
 14     solve:Array + int -> plus
 15 3.Date --> ExamRoom/people + sort
 16     solve:map + int + vector
 17 */
 18 typedef struct STUDATA
 19 {
 20     char id[13];
 21     int result;
 22 }studata;
 23 typedef struct EXAMROOMID
 24 {
 25     int id;
 26     int cnt=0;
 27 }examroom;
 28 bool CmpStuData(studata a, studata b)
 29 {
 30     if(a.result != b.result)
 31     {
 32         return a.result > b.result;
 33     }
 34     else if(a.id != b.id)
 35     {
 36         return strcmp(a.id, b.id) < 0;
 37     }
 38     return false;
 39 }
 40 bool CmpExamRoom(examroom a, examroom b)
 41 {
 42     if(a.cnt != b.cnt)
 43     {
 44         return a.cnt > b.cnt;
 45     }
 46     else if(a.id != b.id)
 47     {
 48         return a.id < b.id;
 49     }
 50     return false;
 51 }
 52 int main()
 53 {
 54     //指令1数据存储
 55     vector<studata> levelTStu;
 56     vector<studata> levelAStu;
 57     vector<studata> levelBStu;
 58     //指令2数据存储
 59     int N,M,examRoomCnt[1000] = {0},examRoomResult[1000] = {0};
 60     //指令3数据存储
 61     unordered_map<int, unordered_map<int, examroom> > dateExamData;
 62
 63     studata tempStuData;
 64     examroom tempExamroom;
 65     char examRoomId[5] = {0};
 66     char examDateStr[7] = {0};
 67
 68     scanf("%d %d", &N, &M);
 69     //数据读入
 70     while(N--)
 71     {
 72         scanf("%s",tempStuData.id);
 73         scanf("%d", &tempStuData.result);
 74         //指令1
 75         if(tempStuData.id[0] == ‘A‘)
 76         {
 77             levelAStu.push_back(tempStuData);
 78         }
 79         else if(tempStuData.id[0] == ‘B‘)
 80         {
 81             levelBStu.push_back(tempStuData);
 82         }
 83         else
 84         {
 85             levelTStu.push_back(tempStuData);
 86         }
 87         //指令2
 88         strncpy(examRoomId, tempStuData.id + 1, 3);
 89         int examRoom = atoi(examRoomId);
 90         ++ examRoomCnt[examRoom];
 91         examRoomResult[examRoom] += tempStuData.result;
 92         //指令3
 93         strncpy(examDateStr, tempStuData.id + 4, 6);
 94         int examDate = atoi(examDateStr);
 95         dateExamData[examDate][examRoom].id = examRoom;
 96         ++ dateExamData[examDate][examRoom].cnt;
 97     }
 98    // cout << "Data entered over" << endl;
 99     int tempCmd;
100     char cmdStr[7] = {0};
101     int cmdCnt = 0;
102     //指令读入
103     while(M--)
104     {
105         memset(cmdStr,0,sizeof(cmdStr));
106         scanf("%d %s", &tempCmd, cmdStr);
107         ++ cmdCnt;
108         printf("Case %d: %d %s\n", cmdCnt, tempCmd, cmdStr);
109         bool outputFlag = false;
110         if(tempCmd == 1)
111         {
112             if(cmdStr[0] == ‘A‘)
113             {
114                 sort(levelAStu.begin(), levelAStu.end(), CmpStuData);
115                 for(int i = 0; i < levelAStu.size(); ++ i)
116                 {
117                     outputFlag = true;
118                     printf("%s %d\n", levelAStu[i].id, levelAStu[i].result);
119                 }
120             }
121             else if(cmdStr[0] == ‘T‘)
122             {
123                 sort(levelTStu.begin(), levelTStu.end(), CmpStuData);
124                 for(int i = 0; i < levelTStu.size(); ++ i)
125                 {
126                     outputFlag = true;
127                     printf("%s %d\n", levelTStu[i].id, levelTStu[i].result);
128                 }
129             }
130             else
131             {
132                 sort(levelBStu.begin(), levelBStu.end(), CmpStuData);
133                 for(int i = 0; i < levelBStu.size(); ++ i)
134                 {
135                     outputFlag = true;
136                     printf("%s %d\n", levelBStu[i].id, levelBStu[i].result);
137                 }
138             }
139         }
140         else if(tempCmd == 2)
141         {
142             strncpy(examRoomId,cmdStr,3);
143             int examRoom = atoi(examRoomId);
144             if(examRoomCnt[examRoom] > 0)
145             {
146                 outputFlag = true;
147                 printf("%d %d\n", examRoomCnt[examRoom], examRoomResult[examRoom]);
148             }
149         }
150         else if(tempCmd == 3)
151         {
152             strncpy(examDateStr,cmdStr,6);
153             int examDate = atoi(examDateStr);
154             unordered_map<int, examroom> tempDateExamData = dateExamData[examDate];
155             examroom tempExamroomArray[tempDateExamData.size()];
156             if(tempDateExamData.size() > 0)
157             {
158                 outputFlag = true;
159                 int i = -1;
160                 for(auto it = tempDateExamData.begin(); it != tempDateExamData.end(); ++ it)
161                 {
162                     tempExamroomArray[++i] = it->second;
163                 }
164                 sort(tempExamroomArray, tempExamroomArray+tempDateExamData.size(), CmpExamRoom);
165                 for(i = 0; i < tempDateExamData.size(); ++ i)
166                 {
167                     printf("%d %d\n", tempExamroomArray[i].id, tempExamroomArray[i].cnt);
168                 }
169             }
170         }
171         if(!outputFlag)
172         {
173             printf("NA\n");
174         }
175     }
176     return 0;
177 }

原文地址:https://www.cnblogs.com/codewars/p/10389764.html

时间: 2024-10-25 12:27:49

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

B1095 解码PAT准考证

题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/1071786104348536832 PAT 准考证号由 4 部分组成: 第 1 位是级别,即 T 代表顶级:A 代表甲级:B 代表乙级: 第 2~4 位是考场编号,范围从 101 到 999: 第 5~10 位是考试日期,格式为年.月.日顺次各占 2 位: 最后 11~13 位是考生编号,范围从 000 到 999. 现给定一系列考生的准考证号和他们的成绩,请你按照

PTA乙级 (*1095 解码PAT准考证 (25分))

1095 解码PAT准考证 (25分) https://pintia.cn/problem-sets/994805260223102976/problems/1071786104348536832 题目大意:给出一组学生的准考证号和成绩,准考证号包含了等级(乙甲顶),考场号,日期,和个人编号信息,并有三种查询方式查询一:给出考试等级,找出该等级的考生,按照成绩降序,准考证升序排序查询二:给出考场号,统计该考场的考生数量和总得分查询三:给出考试日期,查询改日期下所有考场的考试人数,按照人数降序,考

静态PAT、动态PAT实验报告

网络运维 静态PAT.动态PAT 实验报告姓名: 李军 班级: NTD1710 日期: 2017 年 1 月 5 日实验任务 配置要求:PC192.168.1.1通过防火墙动态PAT转换访问PC120.1.1.1Server通过防火墙静态PAT转换访问PC120.1.1.1思路及实验步骤 配置思路:第一步.首先配置终端设备PC机和Server服务器的IP地址第二步.配置SW3.ISP.R1设备的VLAN及IP,使其能够ping 通终端PC机IPSW3:port link-type accessp

乙级 1095 解码PAT准考证

PAT 准考证号由 4 部分组成: 第 1 位是级别,即 T 代表顶级:A 代表甲级:B 代表乙级: 第 2~4 位是考场编号,范围从 101 到 999: 第 5~10 位是考试日期,格式为年.月.日顺次各占 2 位: 最后 11~13 位是考生编号,范围从 000 到 999. 现给定一系列考生的准考证号和他们的成绩,请你按照要求输出各种统计信息. 输入格式: 输入首先在一行中给出两个正整数 N(≤)和 M(≤),分别为考生人数和统计要求的个数. 接下来 N 行,每行给出一个考生的准考证号和

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

PAT 准考证号由 4 部分组成: 第 1 位是级别,即 T 代表顶级:A 代表甲级:B 代表乙级: 第 2~4 位是考场编号,范围从 101 到 999: 第 5~10 位是考试日期,格式为年.月.日顺次各占 2 位: 最后 11~13 位是考生编号,范围从 000 到 999. 现给定一系列考生的准考证号和他们的成绩,请你按照要求输出各种统计信息. 输入格式: 输入首先在一行中给出两个正整数 N(≤)和 M(≤),分别为考生人数和统计要求的个数. 接下来 N 行,每行给出一个考生的准考证号和

1095 解码PAT准考证

麻烦的一批!!!还好题目比较耿直,按要求输出即可,超时就换unordered_map. 新学了小玩意STL-pair,可以理解成一个结构体. struct pair{ typename1 first; typename2 second; }; 用途: 1.可以代替二元结构体及其构造函数,节省编码时间.类似 B1085 PAT单位排行. 2.可以作为map的键值对来进行插入. 1 #include"iostream" 2 #include"algorithm" 3 #

PAT(A) 1075. PAT Judge (25)

The ranklist of PAT is generated from the status list, which shows the scores of the submittions. This time you are supposed to generate the ranklist for PAT. Input Specification: Each input file contains one test case. For each case, the first line

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

Programming Ability Test (PAT) is organized by the College of Computer Science and Technology of Zhejiang University. Each test is supposed to run simultaneously in several places, and the ranklists will be merged immediately after the test. Now it i

PAT甲级——A1025 PAT Ranking

Programming Ability Test (PAT) is organized by the College of Computer Science and Technology of Zhejiang University. Each test is supposed to run simultaneously in several places, and the ranklists will be merged immediately after the test. Now it i