集合
题目描述
对于包含整数多值集合A={a1,a2,⋯,an},执行以下两步操作
- 将某些元素加上整数x
- 将某些元素减掉整数y
请问能否使得A的元素全部相等?
输入
第一行是一个整数K(1≤K≤100),表示样例的个数。
每个样例的第一行是一个整数n(1≤n≤100,000)。
第二行是{ai|i=1,2,⋯n},0≤ai≤1,000,000,000。输出
每行输出一个样例的结果,如果可以使得元素全部相等输出"Yes",否则输出"No"
样例输入
2 5 2 1 2 1 3 5 1 2 3 4 5样例输出
Yes No
如果一个数组里不同的数的个数n,经过思考与试验(?),我们发现只有第一步能够将n变为2时,经过第二步的运算才能使元素全部相等。很容易想到n<=3的话为yes,如果n>3就是no。但是还忽略了一点就是当n=4时也有可能是yes。因为如果4个不同的数两两组合相加所得的和是相同的话,也可以是yes。如1,4,14,17(1+17=4+14)-——14,17,14,17——14,14,14,14.所以这里是一个很大很大的坑!!
#include<stdio.h>
int main()
{
int z,n,i,b,c,t;
scanf("%d",&z);
while(z--)
{
int ch[7];
scanf("%d",&n);
scanf("%d",&ch[0]);
i=0,n--;
while(n--)
{
scanf("%d",&b);//判断有几个不同的数。输入一个数字,比较一下。
if(i<4)
{
for(c=0;c<=i;c++)//和数组现有的不同的数字进行比较。
{
if(ch[c]==b)
{
break;
}
}
if(c>i)//和数组里的数都不同,可以存入数组。
{
i++;
ch[i]=b;
}
}
}
if(i<3)
printf("Yes\n");
else if(i==3)
{
for(int b=0;b<3;b++)//排升序。方便下面的分组计算。
{
for(c=b+1;c<=3;c++)
{
if(ch[b]>ch[c])
{
t=ch[b];
ch[b]=ch[c];
ch[c]=t;
}
}
}
if((ch[0]+ch[2]==ch[1]+ch[3])||ch[0]+ch[3]==ch[1]+ch[2])//两两分组计算判断和是否相同
printf("Yes\n");
else
printf("No\n");
}
else
printf("No\n");
}
return 0;
}
今天是2019年的第一天!!这么勤奋的学习我也是被自己感动惹。新年快乐!