PAT 1083 是否存在相等的差(20)(代码+思路)

1083 是否存在相等的差(20 分)

给定 N 张卡片,正面分别写上 1、2、……、N,然后全部翻面,洗牌,在背面分别写上 1、2、……、N。将每张牌的正反两面数字相减(大减小),得到 N 个非负差值,其中是否存在相等的差?

输入格式:

输入第一行给出一个正整数 N(2 ≤ N ≤ 10 000),随后一行给出 1 到 N 的一个洗牌后的排列,第 i 个数表示正面写了 i 的那张卡片背面的数字。

输出格式:

按照“差值 重复次数”的格式从大到小输出重复的差值及其重复的次数,每行输出一个结果。

输入样例:

8
3 5 8 6 2 1 4 7

输出样例:

5 2
3 3
2 2

PS:

        我的思路:这道题记录重复差,可以利用map模板的特性(自动排序,不会用额外的key) 。

        注意:1、map自动排序默认为升序,所以我们需要加入第三个参数。

                2、题目引言最后那句话是要求我们求存在相等的重复差,只要考虑重复差次数大于1的情况就行了

#include <iostream>
#include<map>
using namespace std;
int main(){
	map<int, int>::iterator it;
	map<int, int, greater<int>> map;		//第三个参数compare(默认为less<int>),此时我们需要降序
	int n, t;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> t;
		map[abs(t - i)]++;		//取绝对值加到map中
	}
	for (it = map.begin(); it != map.end(); it++)
		if(it->second>1)		//注意要重复次数大于1才输出
			cout << it->first << " " << it->second << endl;
	return 0;
}
原文地址:https://www.cnblogs.com/F-itachi/p/9974423.html