[1083]. 是否存在相等的差 (20)

题目:

[1083]. 是否存在相等的差 (20)

时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard
作者 CHEN, Yue

给定 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

思路:

因为他是要计算某个差值的个数,所以这种认家门的数据你可以用两种方法解决一种是桶排序(考虑到这里的数据并不是很大,所以用桶排序也OK),另一种是映射表map,(因为我是用的映射表所以我在这里就只讲映射表)因为他这里是要一个降序的状态,而map会自动从小到大排序,所以我们就要用逆向迭代器reverse_iterator来解决输出的问题;

注意:

看题目的名字“是否存在 相等的差”所以在输出的时候当某个key的value是一的时候不输出

C++代码如下:

#include"iostream"
#include"map"
using namespace std;
int main()
{
    int n;
    cin>>n;
    int x;
    int s;
    map<int,int> mapp;
    int i;
    for(i=0;icin>>x;
        s=max(x,i+1)-min(x,i+1);
        mapp[s]++;
    }
    for(map<int,int>::reverse_iterator it=mapp.rbegin();it!=mapp.rend();it++)//逆向迭代器
    {
        if(it->second!=1)
        cout<first<<" "<second<return 0;
}

你可能感兴趣的:(PAT,pat,cpp,1083,乙级)