题目描述![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4091a47363c1e85f2ca11b730400b9a1.png)
样例
限制条件
数据规模
思路
这里是对一组数进行处理,判断是否存在一个数K,使得这组数中一部分数进行加减K的操作,使得这组数经处理后所有数都相同。
容易想到,如果这组数只是一个数的重复,或两个数的重复,则K肯定存在(若是一个数则为任意数,两个数则为两者之差)。
而若这组数是三个数的重复,若这三个数中有一个数恰好是三者的平均数,则可将K设为三者中最大数与平均数之差,使得这组数经处理后都为平均数。
在其他条件下,K都不存在。所以,我们可以使用一个集合来保存所有数(达到去重的目的),最后依据集合的大小和内容依据上述思路判断K是否存在。
代码
#include <iostream>
#include <unordered_set>
using namespace std;
const int size=1e4+10;
long long arr[size];
int main(int argc, char** argv) {
int n;
scanf("%d",&n);
while(n--)
{
int num;
scanf("%d",&num);
for(int i=0;i<num;i++)
scanf("%lld",&arr[i]);
unordered_set<long long> ss;
for(int i=0;i<num;i++)
{
ss.insert(arr[i]);
if(ss.size()>3)
break;
}
if(ss.size()<3)
printf("YES\n");
else if(ss.size()>3)
printf("NO\n");
else
{
long long temp=0;
for(auto it=ss.begin();it!=ss.end();it++)
temp+=*(it);
if(ss.find(temp/3)!=ss.end())
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}