目录

体会

代码(非满分)

改进

AC代码

体会

这题主要是考察对STL中string,map,vector的应用以及自定义sort()应用。

类型1和2的处理很容易。

类型3要求对于指定date,按照每个考场进行分类,记录不同考场的人数,按照人数非升序,考场号升序(如果前者相同)输出。

我一开始还是很死板地想全在sort里面把它给解决掉,但是一直没做出来。并且收获了map的键和值都不可以是数组的结论。

后面改用这个数据结构

map<int,int> doubleMap[maxn];//map<site,num> doubleMap[date]

map是可以判空、计数和遍历的。而且初始化int值为0,这方便记每个考场的人数。

虽然map不可以排序,但是可以声明和map同样类型的向量vector<int,int>来排序,通过遍历把map的键值拷贝到vector中。遍历的过程中it->first和it->second可以调换位置,虽然本题不这么做也可。

比较函数cmp的参数类型设置为pair<int,int>即可。

以下是类型三相关代码

#part1
bool cmp3(pair<int,int> a,pair<int,int> b){return a.first!=b.first?a.first>b.first:a.second<b.second;
}#part2
//type 3
sscanf(str.substr(4,6).c_str(),"%d",&date);
doubleMap[date][site] ++;#part3
int date;
cin>>date;
printf("Case %d: 3 %d\n",i,date);
if(doubleMap[date].size()==0)printf("NA\n");
else{vector<pair<int,int> > vi;map<int,int>::iterator it = doubleMap[date].begin();for(;it!=doubleMap[date].end();it++){vi.push_back(make_pair(it->second,it->first));}sort(vi.begin(),vi.end(),cmp3);for(int j=0;j<vi.size();j++){printf("%d %d\n",vi[j].second,vi[j].first);}
}

代码(非满分)

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<map>
#include<cstring>
#include<set>using namespace std;const int maxn = 1000001;map<string,int> cardToGrade;map<char,vector<string> > levelToCard;map<int,vector<string> > siteToCard;map<int,int> doubleMap[maxn];//map<site,num> doubleMap[date]bool cmp1(string a,string b){return cardToGrade[a]!=cardToGrade[b]?cardToGrade[a]>cardToGrade[b]:a<b;
}bool cmp3(pair<int,int> a,pair<int,int> b){return a.first!=b.first?a.first>b.first:a.second<b.second;
}int main(){int pNum,qNum;scanf("%d %d",&pNum,&qNum);string str;int grade,site,date;for(int i=0;i<pNum;i++){    cin>>str;scanf("%d",&grade);cardToGrade[str] = grade;//tyep 1 char level = str[0];levelToCard[level].push_back(str);//type 2sscanf(str.substr(1,3).c_str(),"%d",&site);siteToCard[site].push_back(str);//type 3sscanf(str.substr(4,6).c_str(),"%d",&date);    doubleMap[date][site] ++;}for(int i=1;i<=qNum;i++){int t;cin>>t;switch(t){case 1:char level;cin>>level;printf("Case %d: 1 %c\n",i,level);if(levelToCard[level].size()==0)printf("NA\n");else{sort(levelToCard[level].begin(),levelToCard[level].end(),cmp1);for(int j=0;j<levelToCard[level].size();j++){cout<<levelToCard[level][j]<<" "<<cardToGrade[levelToCard[level][j]]<<endl;}} break;case 2:int site;cin>>site;printf("Case %d: 2 %d\n",i,site);if(siteToCard[site].size()==0)printf("NA\n");else{int nt = siteToCard[site].size();int ns = 0;for(int j=0;j<nt;j++){ns += cardToGrade[siteToCard[site][j]];}cout<<nt<<" "<<ns<<endl;}break;case 3:int date;cin>>date;printf("Case %d: 3 %d\n",i,date);if(doubleMap[date].size()==0)printf("NA\n");else{vector<pair<int,int> > vi;map<int,int>::iterator it = doubleMap[date].begin();for(;it!=doubleMap[date].end();it++){vi.push_back(make_pair(it->second,it->first));}sort(vi.begin(),vi.end(),cmp3);for(int j=0;j<vi.size();j++){printf("%d %d\n",vi[j].second,vi[j].first);}}break; }}return 0;
}

改进

上述代码提交后还有一个测试用例是错的,一个是超时的

超时解决方案:

用unordered_map取代map(前者在查找时更快)

注意dev本地上可能要加上

#include<tr1/unordered_map>
using namespace std::tr1;

提交时只需要加

#include<unordered_map>

另一改进是,我不再一开始就对输入进行映射分类,而是先存进vector中,再根据需要取所需。

之前可怕的map数组也就变成了普通的map变量

unordered_map<string,int> umap;

另一个小小改进是,把site和date都不看成int而直接视作string,反而遍历了后序的比较。写sscanf不麻烦吗?

AC代码

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
#include<stdlib.h>
#include<time.h>
#include<vector>
#include<set>
#include<string>
#include<tr1/unordered_map>using namespace std;
using namespace std::tr1;
typedef long long LL;const int maxn = 10007;
const int MOD = 1000000007;
const int INF = 1000000000;//INF:下确界
const LL SUP = (1LL<<63)-1;//SUP:上确界
const double eps = 1e-5;struct Node{string id;int v;
};bool cmp1(const Node &a,const Node &b){return a.v!=b.v?a.v>b.v:a.id<b.id;
}bool cmp3(pair<string,int> a,pair<string,int> b){return a.second!=b.second?a.second>b.second:a.first<b.first;
}Node node[maxn];int main(){int pNum,qNum;cin>>pNum>>qNum;for(int i=0;i<pNum;i++){string id;int v;cin>>id>>v;node[i].id = id;node[i].v = v;}for(int i=1;i<=qNum;i++){int t,num = 0,score = 0;vector<Node> vi;string site,date;unordered_map<string,int> umap;vector<pair<string,int> > vi3;cin>>t;switch(t){case 1:char ch;cin>>ch;printf("Case %d: 1 %c\n",i,ch);for(int j=0;j<pNum;j++){if(node[j].id[0]==ch)vi.push_back(node[j]);}if(vi.size()==0)printf("NA\n");else{sort(vi.begin(),vi.end(),cmp1);for(int j=0;j<vi.size();j++){printf("%s %d\n",vi[j].id.c_str(),vi[j].v);}}break;case 2:cin>>site;printf("Case %d: 2 %s\n",i,site.c_str());for(int j=0;j<pNum;j++){if(node[j].id.substr(1,3)==site){num ++;score += node[j].v; }}if(num == 0)printf("NA\n");else printf("%d %d\n",num,score);break;case 3:cin>>date;printf("Case %d: 3 %s\n",i,date.c_str());for(int j=0;j<pNum;j++){if(node[j].id.substr(4,6)==date)umap[node[j].id.substr(1,3)] ++;}if(umap.size()==0)printf("NA\n");else{unordered_map<string,int>::iterator it = umap.begin();for(;it!=umap.end();it++){vi3.push_back(make_pair(it->first,it->second));}sort(vi3.begin(),vi3.end(),cmp3);for(int j=0;j<vi3.size();j++){printf("%s %d\n",vi3[j].first.c_str(),vi3[j].second);}}                   }}return 0;
}

PAT(甲级)2018年冬季考试 7-2 Decode Registration Card of PAT相关推荐

  1. PAT甲级1153 Decode Registration Card of PAT :[C++题解]结构体、哈希表、排序、类似数据库查询题、好题

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析: 本题是三种不同的询问,难道要写三个结构体?想了想,就写了一个结构体,参赛人结构体,内容包括考号id和成绩grade,然后开结构体数组 ...

  2. 1153 Decode Registration Card of PAT (25分)

    1153 Decode Registration Card of PAT (25分) 题意: 给出一组学生的准考证号和成绩 准考证号组成为:考试等级(TAB),考场号(从101到999),考试日期(y ...

  3. PAT A1153 Decode Registration Card of PAT ——凭谁问,廉颇老矣,尚能饭否

    PAT A1153 Decode Registration Card of PAT 今天选的题目真是*&^%$#*,不但不值钱,搞起来还相当麻烦 思路就是输入的过程中根据查询条件映射和排序好所 ...

  4. PAT 1153 Decode Registration Card of PAT (25 分)- 甲级

    A registration card number of PAT consists of 4 parts: the 1st letter represents the test level, nam ...

  5. 【PAT甲级】2020冬季 PAT 甲级

    2020冬季 PAT 甲级记录 第一次参加PAT,本来九月份报名的时候是打算到十二月份的时候把乙级的题库刷完,然后甲级的题库刷一半,结果因为各种各样的事情(主要是懒又没坚持0.0)这次直到考前乙级才刷 ...

  6. PAT(甲级)2018年冬季考试 7-3 Vertex Coloring

    1. 起先我的思路是,对于每一种方案,把相同颜色的下标放到一个集合,对于每一个集合判断里面的元素互相之间是否有着邻接关系.有一个用例超时,20/25. 2. 转变思路,对于每一种方案,遍历邻接关系,看 ...

  7. PAT(甲级)2018年冬季考试 7-1 Google Recruitment

    1. 本题是 substr+sscanf的绝佳实践. 2. 判断素数使用i*i<=n与i<=(int)sqrt(0.1*x)的区别是前者可能再n接近10的9次方时溢出,但本题不会. 3. ...

  8. PAT(甲级)2018年冬季考试 7-4 Heap Paths(非递归与递归解法)

    非递归解法 1. 前置知识:完全二叉树的属性 1.1 从1开始存储,子节点的下标除以二得到的是父节点的下标 1.2 数组的存放顺序刚好是层序遍历顺序 1.3 从1开始存储,节点的下标i和结点总数n如果 ...

  9. 【PAT】2021年冬季考试甲级,摸鱼游记、92分

    T1,简单模拟,20/20分 #include<bits/stdc++.h> using namespace std; const int maxn = 1e5+10; int a[max ...

最新文章

  1. java.util.concurrent包详细分析--转
  2. 每天读5分钟,受益匪浅、
  3. 基于SpringJDBC 实现关键功能-QueryRuleSqlBulider
  4. Redis单机部署、添加开机自启、配置参数
  5. 如何设计良好的viewcontroller
  6. java修改配置文件参数_在java类中获取在.properties配置文件中设置的参数
  7. 口腔取模过程及注意事项_康贝齿科首家引进LAUNCA数字化口腔扫描,走进口腔数字化诊疗时代!...
  8. python classmethod用处_Python classmethod类方法修饰符
  9. java垃圾回收机制的理解
  10. 数据仓库之电商数仓-- 2、业务数据采集平台
  11. xgboost: 速度快效果好的boosting模型
  12. 一个spark receiver 或多个spark receiver 接收 多个flume agent
  13. takephoto 框架_GitHub - Smecking/TakePhoto: 一款用于在Android设备上获取照片(拍照或从相册、文件中选择)、裁剪图片、压缩图片的开源工具库...
  14. 2021亳州高考成绩查询,2021年亳州高考状元名单公布,亳州文理科状元是谁多少分...
  15. php 中文key_API常用签名验证方法(PHP实现)
  16. HDU 1576 A/B(数论简单题,求逆元)
  17. 房友手机服务器安装文件,房友软件服务器地址
  18. MSM8953 Android9.0 配置USB2.0 Camera
  19. 关于“socket:10106 无法加载或初始化请求的服务提供程序”问题的解决方法
  20. vue处理PDF文档流数据并实现PDF的预览以及打印功能以及处理PDF打印乱码问题

热门文章

  1. 小程序json字符串转 json对象 { name :你好} 转成 { name :你好}
  2. Day03 - Ruby比一比:Module的include与extend
  3. tf.nn.relu
  4. 给input type=color设置默认值
  5. 偏执却管用的 10 条 Java 编程技巧
  6. 利用SurfaceView显示正弦曲线,仿造示波器
  7. jfinal框架下使用c3P0连接池连接sql server 2008
  8. Linux学习笔记—— 权限及权限管理
  9. oracle相关操作
  10. 深入理解 JavaScript 中的 replace 方法