给定 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
解题思路:
注意要筛选次数大于2的输出
c++代码如下:
#include <bits/stdc++.h>
using namespace std;
struct num
{
num(int a)
:_data(a)
{
_times = 1;
}
bool operator<(const num &e) const
{
return _data >= e._data;
}
int _data;
int _times;
};
int main()
{
multiset<num> s;
int n;
cin >> n;
for(int i = 1;i <= n;++i)
{
int a;
cin >> a;
a = abs(i-a);
auto t = s.begin();
while(t != s.end())
{
if(t->_data == a) break;
++t;
}
if(t == s.end())
{
s.insert(num(a));
}
else
{
num n(a);
n._times = t->_times+1;
s.erase(t);
s.insert(n);
}
}
for(auto & elem : s)
{
if(elem._times > 1)
cout << elem._data << " " << elem._times << endl;
}
}