PAT(甲级)2018年冬季考试 7-2 Decode Registration Card of PAT
目录
体会
代码(非满分)
改进
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;
}
相关文章:

DOS、Mac 和 Unix 文件格式+ UltraEdit使用
文件格式 区分DOS、Mac 和 Unix分别对应三种系统从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种文件模式 区分ASCII模式和Binary模式 通常由系统决定,大多数Linux/UNIX系统只有两种模式:文本模式和二进制模式。文本传输器使用…

灰度图像--图像分割 Scharr算子
学习DIP第46天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发: https://github.com/Tony-Tan/DIPpro 更多图像处理机器学习…

FileUpload生成图片水印,文字水印(转载)
/** <summary>/// 生成缩略图/// </summary>/// <param name"originalImagePath">源图路径(物理路径)</param>/// <param name"thumbnailPath">缩略图路径(物理路径)</para…

1151 LCA in a Binary Tree (含求LCA的通法)
目录 解法一思路 结果 解法一改进 解法一改进结果 解法二思路 解法一代码 解法一改进代码 解法二代码(AC) 解法一思路 1. 根据先序和中序建树 2. 对树进行深度优先遍历,找到每一个结点的父节点(注意:由于值的范围是int,直接用可…

cf 414B Mashmokh and ACM 动态规划
题目链接:http://codeforces.com/problemset/problem/414/B dp[i][j]表示长度为i、最后一个数字为j的合法序列总数 dp[1][1...2000]都是1 后面用dp[i-1][j] 去更新 dp[i][j*t] (1 < j*t < 2000) 即用因子去更新它的倍数 表面上看是2000^3的复杂度会爆 其实不用…

解决:angularjs radio默认选中失效问题
添加ng-model后checked"checked"失效,可见angularjs也不好,会失效html标准属性解决:添加ng-checked"1"<input type"radio" ng-model"sel_course" value"1" ng-checked"1" /…

在ireport报错 报 jdk5找不到的解决办法
在ireport安装目录下, etc目录下有ireport.conf, 其中有jkdhome设置, 把前面的#(注释)去掉, 换成自己的jdk目录就行 双引号不要去掉 jdk地址放在双引号之间 比如 改成 jdkhome"G:/ACD/jdk1.5.0&quo…

如何通过中序和层序序列建立二叉树
有这样一棵二叉树 根据节点个数 9 层序遍历结果 15 23 8 16 2 32 28 7 11 中序遍历结果 16 23 7 32 11 2 28 15 8 预期先序输出 15 23 16 2 32 7 11 28 8 运行结果 这个过程和建立二叉查找树(BST)的过程是非常相像的,将laSq[laIndex]插入到根为root的子树中&a…

BZOJ 3573 米特运输
Description 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量。在以米特为主要能源的D星上,这种米特能源的运输和储存一直是一个大问题。 D星上有N个城市,我们将其顺序编号为1到N,1号城市为首都。这N个城市由N-1条单向高速通…

[学习笔记]最小割之最小点权覆盖最大点权独立集
最小点权覆盖 给出一个二分图,每个点有一个非负点权要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可。 证明&…

10分钟学会Google Map API
http://space.itpub.net/14734354/viewspace-374828 前几天玩了玩Google的Map API,感觉还不错,很简单。但凡有过任何编程经验的同学,看完以下的教程,都可以在10分钟内掌握它的主要功能。另外我还做了个简单的小例子,有…

1143 Lowest Common Ancestor(建树与不建两种思路)
目录 解法一 解法二 解法一 这题可以不建树,直接利用BST的性质:左子树<根节点<右子树,对先序序列进行遍历,如果有某个元素大于等于u,v中较小的且小于等于u,v中较大的,则可能是根节点。 这题数据弱࿰…

UIScrollView
UIScrollView(包括它的子类 UITableView 和 UICollectionView)是 iOS 开发中最常用也是最有意思的 UI 组件,大部分 App 的核心界面都是基于三者之一或三者的组合实现。UIScrollView 是 UIKit 中为数不多能响应滑动手势的 view,相比…

MySQL练习题:常用函数
1. 以首字母大写,其他字母小写的方式显示所有员工的姓名2. 将员工的职位用小写字母显示3. 显示员工姓名超过5个字符的员工名4. 用#来填充员工职位job的结尾处,按10个字符长度输出。5. 去除字符串 hello world 两边的空格,并将单词间的空格改…

我的WINCE4.2历程(10)
2010-04-02 今天的主要工作: 1)RTC4513驱动调试,又做了一些尝试(检查GPIO口的第二功能设置是否正常),结果还是不正常,FAINT。 2)回顾了截止到目前取得的进展: aÿ…

1069 The Black Hole of Numbers
注意两点: 1. 不足4位要补足,不仅仅是一开始要考虑,每次得到一个差值,都要考虑 2. 到0也会停下,不仅仅是一开始可能发生,也可能是过程中的某一个差值 另: vector<int> 是可以作为函数…

详解Asp.net MVC DropDownLists
来自网络: Asp.net MVC中的DropDownLists貌似会让一开始从Asp.net Forms转过来的程序员造成不少迷惑.这篇文章讲述了为了使用DropDownLists,你需要在Asp.Net MVC中知道的方方面面. DropDownList,ComboBox,无论你喜欢怎么称呼这些,他们毫无例外的会被生成…

3D中的OBJ文件格式详解(转载)
OBJ文件是Alias|Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种标准3D模型文件格式,很适合用于3D软件模型之间的互导,也可以通过Maya读写。比如你在3dsMax或LightWave中建了一个模型,想把它…

比特币测试网络搭建
转自 https://blog.csdn.net/yzpbright/article/details/81004202 比特币 一、安装 Docker 二、安装和运行比特币测试网络(bitcoin-testnet) 1.下载比特币测试网络(bitcoin-testnet)的Docker镜像 docker pull freewil/bitcoin-testnet-box 2.运行Docker镜像 docker run -t -i -…

1136 A Delayed Palindrome 需再做
注意点: 1. 大整数即高精度整数,数据结构bign要会定义 2. 记得写构造函数或者通过别的方式初始化bign 3. len属性记得手动更新 4. int d[maxn]数组是顺位存储,意味着字符串要逆序读入 AC代码 #include<cstdio> #include<iostr…

ES5-Array-push(),pop(),shift(),unshift()
参考文章:push(),pop() push方法用于在数组的末端添加一个或多个元素,并返回添加新元素后的数组长度。 注意,该方法会改变原数组,而不是创建一个新的数组。var arr [];arr.push(1) // 1 arr.push(a) // 2 arr.push(tr…

visual studio 2005 新建C++空项目无法调试的解决方案
(1)项目属性→配置属性→链接器从→调试→生成调试信息→将“否”改为“是(/DEBUG)”。(2)项目属性→配置属性→C/C→调试信息格式→将“禁用”改为“用于编辑并继续的程序数据库(/ZI)”。(3)项目属性→配置属性→C/C→优化→优化→将“最大化速度(/O2)”改为“禁用(/Od)”。转…

jQuery.append()、jQuery.html()存在的XSS漏洞
使用jQuery.append()、jQuery.html()方法时,如果其中内容包含<script>脚本而没有经过任何处理的话,会执行它。 简单的示例代码如下: 1 var xssStr <script>console.log(1)</script>; 2 $(#test).html(xssStr); 控制台会打…

1132 Cut Integer
注意:取余得到的后半段b可能为0,所以要预先判断,否则会出现浮点错误。 写成 if(b!0&&z%(a*b)0)是不能避免浮点错误的,因为z%(a*b)已经发生。需要更换两个条件的位置,把前提放在前面,即 if(b!0&am…

.net之工作流工程展示及代码分享(二)工作流引擎
在介绍完表单类的时候,接下来介绍工作流引擎,主要由四个类组成,分别是流程、流程步骤、流程实例、流程步骤实例类。 流程类: 1 [Serializable]2 public class Flow3 {4 [XmlAttribute]5 public Guid …

11.CCNA第十一天-配置OSPF/EIGRP(增强型内部网关协议)
配置OSPFBranch(config)#router ospf ?<1-65535> Process ID通配符掩码在IGP协议中,以连续的0和连续的1组成有一种不科学的称呼(反掩码)Branch#show running-config | section router ospfrouter ospf 10network 10.1.0.0 0.0.255.25…

Electio Time poj
第一次用结构体,写些自己的心得: #include<stdio.h> #include<algorithm> using namespace std; #define MAX 50000 struct COW //定义结构体,(由于在cmp()函数里需要用到结构体名…

浙江大学软件学院2020年保研上机模拟练习 7-3 Partial School Ranking
并查集的使用时注意: 1. 合并两个结点是 F[sa] sb 而不是 sb F[sa],想一下含义。 2. 给每个结点赋予其自身为父节点时,要先判断它的父节点是不是0,也许已经有了。 我把照片里其他同学的成绩赋值为0,但是应该考虑到…

小米:开源不仅要站在巨人的肩膀上,还要为巨人指方向
今天上午,第一届小米开源技术峰会在北京举行,会上,小米人工智能与云平台副总裁崔宝秋致开场词,并发表了《小米开源之路》的演讲。 崔宝秋强调小米一直在推动开源,也是开源的倡导者。他告诉我们雷军创立小米的其中一个重…

微软企业库4.1学习笔记(七)创建对象 续集1
3.2使用Unity模块创建企业库对象 下面介绍如何使用前面的方法获取企业库对象的实例。代码示例如下 IUnityContainer containter newUnityContainer(); containter.AddNewExtension<EnterpriseLibraryCoreExtension>();首先创建一个Unity容器,并且添…