题意
给定一个长度为 \(n\) 的数组。
我们可以给一些数加上一个 \(x\) ,也可以减去一个 \(x\) ,也可以不加也不减。
问:是否存在一个数 \(x\) ,使得这个数组里各个数都相等。
思路
一道思维题
-
首先考虑,在这个数组中,相同的元素,我们一定是给它做相同的操作,否则一定不相等,根据这个思想,我们先对数组进行去重。
-
其次,我们再考虑:
如果去重后数组中元素的个数为 \(1\) ,那么不用操作就能满足;
如果个数为 \(2\) ,那么我们就可以让小的数加上 \(x\) ,或者让大数减去 \(x\) 保证相等;
如果个数为 \(3\) ,我们不妨设 \(a,b,c\) 满足 \(a < b < c\) ,那么当且仅当 \(b-a=c-b\) 的时候,才能保证相等;
如果个数大于 \(3\) ,那么就一定不行了,因为 \(3\) 的时候满足 \(b-a=c-b\),再加上几个数那肯定加 \(x\) 或者减 \(x\) 之后不能相等了。
-
所以只有个数等于 \(3\) 的时候需要特判一下,其余的直接
YES
或NO
就行了。
代码实现
#include<bits/stdc++.h>
//#define int long long
#define ll long long
#define next nxt;
#define re register
#define il inline
const int N=1e5+5;
using namespace std;
il int read()
{
int f=0,s=0;
char ch=getchar();
for(;!isdigit(ch);ch=getchar()) f |= (ch=='-');
for(; isdigit(ch);ch=getchar()) s = (s<<1) + (s<<3) + (ch^48);
return f ? -s : s;
}
int n;
int a[N];
int main()
{
n = read();
for(int i=1;i<=n;i++)
a[i] = read();
sort(a+1,a+n+1);/*unique函数是对有序数组就行去重,所以要先进行sort操作*/
int nn = unique(a+1,a+n+1) - a -1;/*nn就是去重后元素的个数,别忘了-1*/
if(nn > 3) printf("NO");/*个数大于3,直接NO*/
else if(nn == 3)/*3的时候特判是否满足b-a == c-b*/
{
if(a[2] - a[1] == a[3] - a[2]) printf("YES");
else printf("NO");
}
else printf("YES");/*小于等于2直接YES*/
return 0;
}
标签:ch,NO,题解,个数,Filya,printf,YES,Homework,define
From: https://www.cnblogs.com/bloodstalk/p/17433058.html