PAT甲级真题1153: 解码PAT准考证

简介: PAT甲级真题1153: 解码PAT准考证

PAT甲级真题1153: 解码PAT准考证

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

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

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

输入格式

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

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

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

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

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

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

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

数据范围

1≤N≤104,

1≤M≤100

输入样例:
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 
AC代码
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<vector>
#include<string>
using namespace std;
const int N=10010;
//构建结构体,使得每个人的准考证号和分数绑定 
struct Person
{
  string id;
  int grade;
  //在结构体中重写判断条件 
  bool operator < (const Person &t) const{
    if(grade!=t.grade)
    {
      return grade>t.grade;
    }
    else{
      return id < t.id;
    }
  }
}p[N];//构建N个人的数组 
int main()
{
  int n,m;
  cin>>n>>m;
  for(int i=0;i<n;++i)
  {
    cin>>p[i].id>>p[i].grade;
  }
  int k=1;//用记录是第几次Case 
  while(m--)
  {
    string t;//类型 
    string c;//指令 
    cin>>t>>c;
    //c_str()函数,可以将string转为字符串 
    printf("Case %d: %s %s\n",k,t.c_str(),c.c_str());
    if(t=="1")
    {
      vector<Person> persons;
      for(int i=0;i<n;i++)
      {
        if(p[i].id[0]==c[0])//判断级别相同的push到persons数组中 
        {
          persons.push_back(p[i]);
        }
      }
      sort(persons.begin(),persons.end());//排序,在结构体中重写判断条件 
      if(persons.empty())cout<<"NA"<<endl;//是空的说明没有找到 
      else{
        for(int i=0;i<persons.size();++i)
        {
          printf("%s %d\n",persons[i].id.c_str(),persons[i].grade);
        }
      }
    }
    else if(t=="2")
    {
      int cnt=0,sum=0;//cnt记录人数,sum记录总分 
      for(int i=0;i<n;++i)
      {
        //substr(1,3),截断从1位置开始,长度为3
        if(p[i].id.substr(1,3)==c)//比较是否是指定考场 
        {
          cnt++;
          sum+=p[i].grade;
        } 
      }
      if(cnt==0)
      {
        cout<<"NA"<<endl;
      }
      else
      {
        cout<<cnt<<" "<<sum<<endl;
      }
    }
    else
    {
      unordered_map<string,int> hash;//定义哈希,将考场编号和人数对应绑定 
      for(int i=0;i<n;i++)
      {
        //substr(4,6),截断从4位置开始,长度为6
        if(p[i].id.substr(4,6)==c)//考试日期匹配
        {
          hash[p[i].id.substr(1,3)]++;//统计在该天中的考场的考生人数
        }
      }
      //pair 默认对first升序,当first相同时对second升序;
      vector<pair<int,string>> room;
      for(auto item : hash)
      {
        //加负号是因为vector默认是升序排序,最后输出时加个负号转正即可
        room.push_back({-item.second,item.first});
      }
      sort(room.begin(),room.end());
      if(room.empty())cout<<"NA"<<endl;
      else{
        for(auto r:room)
        {
          cout<<r.second<<" "<<-r.first<<endl;
        }
      }
    }
    k++;
  }
  return 0;
 }


相关文章
|
关系型数据库 MySQL Linux
CentOS 7.x 卸载删除MariaDB,重新安装
CentOS 7.x 卸载删除MariaDB,重新安装
542 0
|
5月前
|
Ubuntu Linux 定位技术
在Ubuntu 20.04系统安装Matlab R2021a步骤
希望你可以充分享受这场旅行,从无知的迷雾中找到通向智慧的路。好好装备你的 Linux 旅行箱吧,因为还有很多其他的知识世界等待你去探索和征服。在知识的海洋里,只有勇敢的探索者才能找到自己的道路。快乐旅行!
499 23
|
8月前
|
XML Java 数据格式
Spring容器的本质
本文主要讨论Spring容器最核心的机制,用最少的代码讲清楚Spring容器的本质。
|
Kubernetes 测试技术 Perl
混沌测试平台 Chaos Mesh
混沌测试平台 Chaos Mesh
436 1
|
Linux 数据安全/隐私保护 Docker
优化Docker权限管理:配置Docker用户组
Docker 利用 Linux 的用户和组权限来管理对 Docker 守护进程的访问权限。一般情况下,只有 root 用户和属于 docker 用户组的用户才被允许访问 Docker 守护进程。在 Linux 系统上使用 Docker 时,如果您尚未配置 docker 用户组,那么作为非 root 用户执行 Docker 相关命令将要求使用 sudo 来提升权限。
1524 2
优化Docker权限管理:配置Docker用户组
|
区块链
NFT数字藏品(iBOX平台)交易系统开发逻辑技术方案
 NFT是元宇宙的核心和底层支撑之一。As a polymer of equity certificates and smart contracts,NFT has been highly consistent with digital art,intellectual property rights and other market attractive assets since its emergence.It is almost difficult for brands to completely ignore NFT in their own business consideratio
|
Prometheus Kubernetes 网络协议
k8s教程(service篇)-DNS服务搭建和配置
k8s教程(service篇)-DNS服务搭建和配置
1313 0
|
XML Java 数据库连接
SpringBoot - 整合MyBatis配置版(XML)并开启事务
SpringBoot - 整合MyBatis配置版(XML)并开启事务
871 0
|
Oracle 关系型数据库
SQLLDR——CTL文件:字段设置
position 关键字用来指定列的开始和结束位置   position(m:n):指从第 m 个字符开始截止到第 n 个字符作为列值   position(*+2:15):直接指定数值的方式叫做绝对偏移量,如果使用*号,则为相对偏移量,表示上一个字段哪里结束,这次就哪里开始,相对便宜量也可以再做运算。
2243 0
|
存储 算法 关系型数据库
浅谈 Raft 分布式一致性协议|图解 Raft
本篇文章将模拟一个KV数据读写服务,从提供单一节点读写服务,到结合分布式一致性协议(Raft)后,逐步扩展为一个分布式的,满足一致性读写需求的读写服务的过程。
988 0
浅谈 Raft 分布式一致性协议|图解 Raft