PAT Basic 1083 是否存在相等的差 (20) [hash映射,map STL]
题目
给定 N 张卡⽚,正⾯分别写上 1、2、……、N,然后全部翻⾯,洗牌,在背⾯分别写上 1、2、……、 N。将每张牌的正反两⾯数字相减(⼤减⼩),得到 N 个⾮负差值,其中是否存在相等的差?
输⼊格式:
输⼊第⼀⾏给出⼀个正整数 N(2 <= N <= 10000),随后⼀⾏给出 1 到 N 的⼀个洗牌后的排列,第 i 个数表示正⾯写了 i 的那张卡⽚背⾯的数字。
输出格式:
按照“差值 重复次数”的格式从⼤到⼩输出重复的差值及其重复的次数,每⾏输出⼀个结果。
输⼊样例:
8
3 5 8 6 2 1 4 7
输出样例:
5 2
3 3
2 2
解题思路
- 第二行输入,下标从1开始到N结束--卡片正面数字,对应位置数字--卡片背面数字(题目:第i个数表示正⾯写了i的那张卡⽚背⾯的数字)
- 输入时,统计差值出现次数,输入完成统计完成
map
- 定义map,key为差值绝对值,value为差值出现次数
- 逆序输出map的key value(map默认key升序),若value<=1跳过(题目已知:重复差值,1次不算重复)
数组
- 定义数组dfs
- 大小设置为10000(题目已知:1<=N<=10000),最大差值为10000-1;
- 下标为差值(0下标废弃不使用);
- 元素值记录下标对应差值出现的次数;
- 逆序输出数组,(元素值<=1跳过,因为其不算重复差值)
易错点
- 第二行输入下标从1开始计数(下标>=1&&下标<=N)
- 1次不算重复
知识点
map逆序输出
for(map<int,int>::reverse_iterator it=m.rbegin(); it!=m.rend(); it++) {}
Code
Code 01(map)
#include <iostream>
#include <map>
#include <cmath>
using namespace std;
int main(int argc, char * argv[]) {
int N,g;
scanf("%d",&N);
map<int,int> m;
for(int i=1; i<=N; i++) {
scanf("%d",&g);
m[abs(g-i)]++;
}
for(map<int,int>::reverse_iterator it=m.rbegin(); it!=m.rend(); it++) {
if(it->second>1)printf("%d %d\n",it->first,it->second);
}
return 0;
}
Code 02(数组)
#include <iostream>
#include <cmath>
using namespace std;
int main(int argc, char * argv[]) {
int N,g;
scanf("%d",&N);
int dfs[10000]={0};
for(int i=1; i<=N; i++) {
scanf("%d",&g);
dfs[abs(g-i)]++;
}
for(int i=10000-1;i>=0;i--){
if(dfs[i]>1)printf("%d %d\n",i,dfs[i]);
}
return 0;
}
PAT Basic 1083 是否存在相等的差 (20) [hash映射,map STL]的更多相关文章
- PAT Basic 1083 是否存在相等的差 (20 分)
给定 N 张卡片,正面分别写上 1.2.…….N,然后全部翻面,洗牌,在背面分别写上 1.2.…….N.将每张牌的正反两面数字相减(大减小),得到 N 个非负差值,其中是否存在相等的差? 输入格式: ...
- PAT乙级:1083 是否存在相等的差 (20分)
PAT乙级:1083 是否存在相等的差 (20分) 题干 给定 N 张卡片,正面分别写上 1.2.--.N,然后全部翻面,洗牌,在背面分别写上 1.2.--.N.将每张牌的正反两面数字相减(大减小), ...
- PAT(B) 1083 是否存在相等的差(Java)统计
题目链接:1083 是否存在相等的差 (20 point(s)) 题目描述 给定 N 张卡片,正面分别写上 1.2.--.N,然后全部翻面,洗牌,在背面分别写上 1.2.--.N.将每张牌的正反两面数 ...
- PAT 乙级 1083 是否存在相等的差(20 分)
1083 是否存在相等的差(20 分) 给定 N 张卡片,正面分别写上 1.2.…….N,然后全部翻面,洗牌,在背面分别写上 1.2.…….N.将每张牌的正反两面数字相减(大减小),得到 N 个非负差 ...
- PAT Basic 1083
1083 是否存在相等的差 给定 N 张卡片,正面分别写上 1.2.…….N,然后全部翻面,洗牌,在背面分别写上 1.2.…….N.将每张牌的正反两面数字相减(大减小),得到 N 个非负差值,其中是否 ...
- 【PAT】1083 是否存在相等的差(20 分)
//这题不是我耍流氓,实在太简单,只能直接贴代码了,凑个数 #include<stdio.h> int aaa[10005]={0}; int main(){ int N;scanf(&q ...
- 1083 是否存在相等的差 (20 分)C语言
给定 N 张卡片,正面分别写上 1.2.--.N,然后全部翻面,洗牌,在背面分别写上 1.2.--.N.将每张牌的正反两面数字相减(大减小),得到 N 个非负差值,其中是否存在相等的差? 输入格式: ...
- PAT (Basic Level) Practice 1027 打印沙漏 分数 20
本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ***** *** * *** ***** 所谓"沙漏形状",是指 ...
- PAT (Basic Level) Practice 1019 数字黑洞 分数 20
给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字.一直重复这样做,我们很快会停在有" ...
随机推荐
- flink任务性能优化
如何提高 Flink 任务性能 一.Operator Chain 为了更高效地分布式执行,Flink 会尽可能地将 operator 的 subtask 链接(chain)在一起形成 task,每个 ...
- Web基础之Maven
Web基础之Maven Maven是一个优秀的项目管理工具,可以很轻松的管理项目. POM和LifeCycle POM:Project Object Model.也就是项目模型,简单来说就是对项目进行 ...
- Linux预习第三章节《重定向与管道符》20200219
- HDU 5280 BestCoder Round #47 1001:Senior's Array
Senior's Array Accepts: 199 Submissions: 944 Time Limit: 2000/1000 MS (Java/Others) Memory Limit ...
- MFC 选择文件夹
WCHAR szPath[_MAX_PATH] = {}; BROWSEINFO bi; //指定父窗口,在对话框显示期间,父窗口将被禁用 bi.hwndOwner = this->GetSaf ...
- EUI库 - 9 - 数据集合 - 数组集合
ArrayCollection 当数组内的数据被修改了(增删改),组件能有效的获知 myCollection.addEventListener(eui.CollectionEvent.COLLE ...
- gentoo emby-server
最近想用 emby-server + kodi 打造家庭播放平台, 在 gentoo 上面先尝试安装配置 emby-server. 首先, 使用 megacoffee 这个 overlay, 这个上面 ...
- 在mysql中计算百分比
通过查找资料,得到了如下解决方法: 用到了concat()和left() 两个函数 1.CONCAT(str1,str2,...) 返回来自于参数连结的字符串.如果任何参数是NULL, 返回NULL. ...
- mysql自增长字段设置
mysql版本:5.7.27 说明:表中只能设置一个自增长字段[主键.索引(其他普通字段不行))] 设置自增长开始值: ALTER TABLE table_name AUTO_INCREMENT=10 ...
- jquery---利用jquery插件生成二维码
<script type="text/javascript" src="<?php echo RESOURCE_SITE_URL;?>/js/jquer ...