题意:
题目描述
相较于咕咕东,瑞神是个起早贪黑的好孩子,今天早上瑞神起得很早,刷B站时看到了一个序列 ,他对这个序列产生了浓厚的兴趣,他好奇是否存在一个k数 ,使得一些数加上k ,一些数减去 k,一些数不 变,使得整个序列中所有的数相等,其中对于序列中的每个位置上的数字,至多只能执行一次加运算或 减运算或是对该位置不进行任何操作。由于瑞神只会刷B站,所以他把这个问题交给了你!
输入格式
输入第一行是一个正整数 表示数据组数。 接下来对于每组数据,输入的第一个正整数 表示序列 的长 度,随后一行有 个整数,表示序列 。
输出格式
输出共包含 行,每组数据输出一行。对于每组数据,如果存在这样的K,输出"YES",否则输出“NO”。 (输出不包含引号)
样例输入
2
5
1 2 3 4 5
5
1 2 3 4 5
样例输出
NO
NO
思路
这个题目比较简单,分析一下:
如果所有元素相同,则一定YES
如果有两种元素,则一定YES
如果有三种元素,则当且仅当(最大+最小)/2==中位数
是YES
一行最多有三种不同的元素,可以通过STL的map来做。
只需按照上述三类进行编码即可。
心得
签到题+1,关键是稍微分析一下数据特点。
代码
#include <bits/stdc++.h>
using namespace std;
#define LL long long
//#define DEBUG
#ifdef DEBUG
#define dprintf printf
#else
#define dprintf /\
/printf
#endif
LL t;
//LL a[10000+10];
set<LL> s;
int main() {
scanf("%lld", &t);
for(LL c=0; c<t; c++) {
s.clear();
LL n;
scanf("%lld", &n);
for(LL i=0; i<n; i++) {
LL temp;
scanf("%lld",&temp);
s.insert(temp);
}
if(s.size()==1) {
printf("YES\n");
} else if(s.size()==2) {
printf("YES\n");
} else if(s.size()==3) {
LL maxi = *s.begin();
LL mini = *s.rbegin();
LL k=(maxi-mini)/2;
if(s.find((maxi+mini)/2)!=s.end()) {
// dprintf("333%lld\n",(maxi+mini)/2);
printf("YES\n");
} else {
// dprintf("%lld %lld\n",c,s.size());
// for(auto i : s)dprintf("%lld ",i);
printf("NO\n");
}
} else {
// dprintf("%lld %lld\n",c,s.size());
// for(auto i : s)dprintf("%lld ",i);
printf("NO\n");
}
}
return 0;
}