题意:给定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");
}