题意:给定n个元素的序列,问是否能对其中任意个数字进行+x或者-x使得序列所有值相等?

思路:用mp来计数最方便。size==2说明只有2种数字必定可以。 size >3必定不行。 size ==3 判断max+min==2*mid

错误思路:其实不能说是错误把。题目说的是对一些元素,实行+-。我理解的是,必须要有元素进行+和-。 然而题目的意思不是这个。 太坑爹了。

数据分析:1 ≤ n ≤ 100 000 0 ≤ a[i] ≤ 1e9 不存在加,就不存在爆int的情况。 因为a[i]∈[0,1e9]。 直接开vis来判断有几个不同的数字是不合理的。用map就很大程度上节约了空间。

复杂度分析:O(n)

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

const int maxn=1e5+50;
int a[maxn];
map <int,int> mp;

int main(void)
{
    int n;
    cin >> n;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        mp[a[i]++];
    }
    sort(a+1,a+1+n);
    if(mp.size()>3)
    {
        printf("NO\n");
        return 0;
    }
    else if(mp.size()==3)
    {
        int index;
        for(int i=1;i<=n;i++)
        {
            if(a[i]!=a[1])
            {
                index=i;
                break;
            }
        }
        // int cnt1=index-1,cnt2=index1-index,cnt3=n-index1+1;
        //printf("%d %d %d",cnt1,cnt2,cnt3);
        if(a[n]-a[index]==a[index]-a[1])
            printf("YES\n");
        else
            printf("NO\n");
    }
    else
        printf("YES\n");
}