CF714B Filya and Homework 题解

发布时间 2023-05-25 21:50:57作者: Bloodstalk

题意

给定一个长度为 \(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\) 的时候需要特判一下,其余的直接 YESNO 就行了。

代码实现

#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;
}