T1 HRZ的序列
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
题目描述
相较于咕咕东,瑞神是个起早贪黑的好孩子,今天早上瑞神起得很早,刷B站时看到了一个序列aaa,他对这个序列产生了浓厚的兴趣。
他好奇是否存在一个数KKK,使得一些数加上KKK,一些数减去KKK,一些数不变,使得整个序列中所有的数相等。
其中对于序列中的每个位置上的数字,至多只能执行一次加运算或减运算或是对该位置不进行任何操作。
由于瑞神只会刷B站,所以他把这个问题交给了你!
输入格式
输入第一行是一个正整数 t t t表示数据组数。
接下来对于每组数据,输入的第一个正整数nnn表示序列aaa的长度,随后一行有nnn个整数,表示序列aaa。
输出格式
输出共包含ttt行,每组数据输出一行。对于每组数据,如果存在这样的K,输出"YES",否则输出“NO”。(输出不包含引号)
样例输入
2
5
1 2 3 4 5
5
1 2 3 4 5
样例输出
数据点(上限) |
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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)