T1 HRZ的序列
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
题目描述
相较于咕咕东,瑞神是个起早贪黑的好孩子,今天早上瑞神起得很早,刷B站时看到了一个序列aaa,他对这个序列产生了浓厚的兴趣。
他好奇是否存在一个数KKK,使得一些数加上KKK,一些数减去KKK,一些数不变,使得整个序列中所有的数相等。
其中对于序列中的每个位置上的数字,至多只能执行一次加运算或减运算或是对该位置不进行任何操作。
由于瑞神只会刷B站,所以他把这个问题交给了你!
输入格式
输入第一行是一个正整数 t t t表示数据组数。
接下来对于每组数据,输入的第一个正整数nnn表示序列aaa的长度,随后一行有nnn个整数,表示序列aaa。
输出格式
输出共包含ttt行,每组数据输出一行。对于每组数据,如果存在这样的K,输出"YES",否则输出“NO”。(输出不包含引号)
样例输入
样例输出
数据点(上限) | t t t | n n n | a i a_i ai |
---|---|---|---|
1,2 | 10 | 10 | 10 |
3,4,5 | 10 | 1 0 3 10^3 103 | 1 0 9 10^9 109 |
6,7,8,9,10 | 10 | 1 0 4 10^4 104 | 1 0 15 10^{15} 1015 |
思路
比较简单(有坑 )的一道题,如果序列中数的种类超过 3 ,肯定不符合题意,如果等于 3 则这三类数从小到大排序后应该是一个等差数列,小于 3 肯定可以。
ps:因为是 T1 没想到会有溢出的数据…不过因为map 的关键字可以是负数(溢出后仍能存),当数的种类不等于 3 时的结果肯定还是正确的,不过等于 3 时判断是否为等差数列时结果应该就不对了,好在数据比较友好,就WA了最后一个点。
代码实现
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
typedef long long ll;
int t,n;
ll a;
map<ll,int> mp;
int main()
{
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a);
mp[a]=1;
}
int size=mp.size();
if(size==3){
map<ll,int>::iterator it=mp.begin();
ll x[5];
int i=0;
while(it!=mp.end()){
x[i]=it->first;
i++;
it++;
}
if(x[0]+x[2]==2*x[1]){
printf("YES\n");
}
else{
printf("NO\n");
}
}
else if(size<3){
printf("YES\n");
}
else{
printf("NO\n");
}
mp.clear();
}
return 0;
}