Set题目描述
对于包含整数多值集合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
思路
这个题首先要做的是统计数字的种类,然后分情况判断。
当有三种数的时候,通过执行那两步操作是一定可以使A的元素全部相等的,当有五种数时,一定不可以使A的元素全部相等。当有四种数时,则需要满足两两等差的条件才可以(例如:当四个数为1,4,5,8时,满足8-5=4-1,1和5先加上三得到四个数为4,4,8,8,两个8减去4就能得到相同的4个数),否则不能。
代码
#include<stdio.h>
int main()
{
int K;
scanf("%d",&K);
while(K--)
{
int n,sum=1;
scanf("%d",&n);
int stra[100001],strb[100001];
for(int i=0; i<n; i++)
{
scanf("%d",&stra[i]);
}
strb[0]=stra[0];
for(int i=1; i<n; i++)
{
int flag=1;
for(int j=0; j<sum; j++)
{
if(stra[i]==strb[j])
{
flag=0;
break;
}
}
if(flag==1)
{
strb[sum]=stra[i];
sum+=1;
}
}
if(sum>4)
printf("No\n");
else if(sum<4)
printf("Yes\n");
else
{
for(int i=0;i<3;i++)
{
for(int j=0;j<3-i;j++)
{
if(strb[j]>strb[j+1])
{
int q=strb[j];
strb[j]=strb[j+1];
strb[j+1]=q;
}
}
}//排序
if((strb[3]-strb[1])==((strb[2]-strb[0])))
printf("Yes\n");
else printf("No\n");
}
}
return 0;
}
本人菜鸡一枚,如有不对,欢迎指正