1083 是否存在相等的差
思路:
- 读取每一张卡片前后面的数字,x是正面的,y是背面的。为确保差值为非负数,当x小于y时用swap算法交换两数。
- 创建一个map来存储每个差值的重复次数。由于题目要求差值要从大到小输出,所以在创建map时传入仿函数greater<int>让map里的键值按降序排列。
- 最后用一个迭代器遍历map,如果重复次数大于1则输出
注意点:
- 如果map按缺省升序排列的话,也可以让用逆向迭代器rbegin和rend来进行遍历,效果一致。
- 对于map的迭代器来说,取值的时候拿到的是pair对组,it->first 和 (*it).first 的效果是一样的
#include<stdio.h>
#include<iostream>
#include<map>
using namespace std;
int L[10005];
map<int, int, greater<int> > mp;
int main(int argc, char* argv[]) {
int n; cin >> n;
for (int i = 1; i <= n; i++) {
int x = i;
int y; cin >> y;
if (x < y) { swap(x, y); }
int cha = x - y;
mp[cha]++;
}
for (map<int, int, greater<int> >::iterator it = mp.begin(); it != mp.end(); ++it) {
if ((*it).second > 1) { cout << (*it).first << " " << (*it).second << endl; }
}
return 0;
}