题目描述
相较于咕咕东,瑞神是个起早贪黑的好孩子,今天早上瑞神起得很早,刷B站时看到了一个序列a,他对这个序列产生了浓厚的兴趣。
他好奇是否存在一个数KK,使得一些数加上KK,一些数减去K,一些数不变,使得整个序列中所有的数相等。
其中对于序列中的每个位置上的数字,至多只能执行一次加运算或减运算或是对该位置不进行任何操作。
由于瑞神只会刷B站,所以他把这个问题交给了你!
输入格式
输入第一行是一个正整数tt表示数据组数。
接下来对于每组数据,输入的第一个正整数n表示序列a的长度,随后一行有n个整数,表示序列a。
输出格式
输出共包含tt行,每组数据输出一行。对于每组数据,如果存在这样的K,输出"YES",否则输出“NO”。(输出不包含引号)
样例输入
2
5
1 2 3 4 5
5
1 2 3 4 5
样例输出
NO
NO
时间限制 1s
空间限制 64MB
数据点(上限) t n a_i
1,2 10 10 10
3,4,5 10^3 10^9
6,7,8,9,10 10 10^4 10^15
解题思路
由题目要求可以得出一个结论,我们可以统计出现的不同数字的个数,如果出现 2 个及一下个数字,这个 K 即为两数之差;出现3个数字,判断其中一个是否为3个数字的平均数,如是,存在 K ,为三数的平均数;现4个及以上数字,不存在K。如果存在 K ,输出“YES",不存在 K ,则输出“NO”。
程序源码
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
int main()
{
int n, m;
long long a, b;
scanf("%d", &n); //表示数据组数
for (int k = 0; k < n; k++) {
scanf("%d", &m); //表示序列a的长度
if (m <= 0) {
continue;
}
long long L[5] = { 0 }; //存储不重复的数字
int count = 0;
for (int i = 0; i < m; i++) {
long long cnum;
bool found = 0;
scanf("%lld", &cnum);
if (count > 3) continue; //不重复的数字个数多余3,无解
for (int j = 0; j < count; j++) { //查找是否存在该数字,并加进来
if (L[j] == cnum) {
found = 1;
break;
}
}
if (!found) L[count++] = cnum;
}
if (count > 3) {
printf("NO\n");
}
else {
if (count <= 2) {
printf("YES\n");
}
else { //size==3
long long mid = L[0] + L[1] + L[2];
bool ok = 0;
for (int i = 0; i < 3; i++) {
if (L[i] + L[i]+ L[i] == mid) ok = 1; //符合要求
}
if (ok) {
printf("YES\n");
}
else {
printf("NO\n");
}
}
}
}
return 0;
}