2018年PAT乙级春考是否存在相等的差 20分 牛逼!一遍过 题型:排序

81 阅读1分钟

1083 是否存在相等的差 - PAT (Basic Level) Practice (中文) (pintia.cn)

自己写的STL写法,一遍过:

#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int a[N];
int sub[N];  
map<int,int>m;
struct CMP
{
    bool operator()(pair<int,int>&a,pair<int,int>&b)
    {
        return a.first>b.first;
    }
};
int main()
{
    int n=0;cin>>n;
 
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        
         sub[i]=abs(a[i]-i);
        m[sub[i]]++; //用一个哈希存储到差值和对应的个数关系
    }

    vector<pair<int,int>> v(m.begin(),m.end());
    sort(v.begin(),v.end(),CMP());  //排个序,按招first降序输出

    for(auto ch:v)
    {
         if(ch.second>=2)
        cout<<ch.first<<" "<<ch.second<<endl;
    }
    return 0;
}

image.png

其实是我搞复杂了,不用开哈希map,开个数组哈希就可以了:


#include<bits/stdc++.h>
using namespace std;

int main()
{
    int a[10005]={0};
    int n;cin>>n;
    for(int i=1;i<=n;i++)
    {
        int temp;cin>>temp;
        a[abs(temp-i)]++;
    }
    for(int i=n;i>=0;i--)
    {
        if(a[i]>1)cout<<i<<" "<<a[i]<<endl;
    }
    return 0;
}

image.png