题目描述
相较于咕咕东,瑞神是个起早贪黑的好孩子,今天早上瑞神起得很早,刷B站时看到了一个序列a,他对这个序列产生了浓厚的兴趣,他好奇是否存在一个数K,使得一些数加上K,一些数减去K,一些数不变,使得整个序列中所有的数相等,其中对于序列中的每个位置上的数字,至多只能执行一次加运算或减运算或是对该位置不进行任何操作。由于瑞神只会刷B站,所以他把这个问题交给了你!
Input
输入第一行是一个正整数t表示数据组数。
接下来对于每组数据,输入的第一个正整数n表示序列a的长度,随后一行有n个整数,表示序列a。
Output
输出共包含t行,每组数据输出一行。对于每组数据,如果存在这样的K,输出"YES",否则输出“NO”。(输出不包含引号)
Sample Input
2
5
1 2 3 4 5
5
1 2 3 4 5
1
2
3
4
5Sample Output
NONO
Solution:
Input -> sort--->count dif_nums;
如果输入的数据不同大小数目 小于三种,必有解;
等于三种,有解的充要条件为三个数构成等差数列
大于三种 无解
审题 注意数据范围 long long
为防止溢出,在判断等差数列的时候,
//if(b[1]+b[3]== 2*b[2])
//if(b[1]-b[2] == b[2] - b[3]
第二种更保险!
1 #include<iostream>
2 #include<cstring>
3 #include<algorithm>
4 using namespace std;
5 int t,nums;
6 long long a[10010],tmp;
7 int cnt=0;
8 long long b[4];
9 int main(){
10 cin>>t;
11 while(t--){
12 //初始化
13 tmp=-1;
14 cnt=0;
15 memset(a,0,sizeof(a));
16 memset(b,0,sizeof(b));
17
18 cin>>nums;
19 for(int i=0;i<nums;i++)
20 {
21 cin>>a[i];
22 }
23 sort(a,a+nums);
24 for(int i=0;i<nums;i++)
25 if(tmp!=a[i])
26 {
27 cnt++;
28 tmp=a[i];
29 if(cnt<=3){
30 b[cnt]=a[i];
31 }
32 else
33 {
34 cnt=4;
35 break;
36 }
37 };
38 if(cnt<=2)
39 cout<<"YES"<<endl;
40 else if(cnt>3)
41 cout<<"NO"<<endl;
42 else{
43 //if(b[1]+b[3]== 2*b[2])
44 if(b[1]-b[2] == b[2] - b[3])
45 cout<<"YES"<<endl;
46 else
47 cout<<"NO"<<endl;
48 }
49 }
50 return 0;
51 }
52 //条件判断 小于等于两种数 可以
53 // 大于三种数 不可
54 // 等于三种 最小+最大== 两倍中间