题目描述
对于包含整数多值集合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
解题思路:能实现题目要求的,一定满足以下条件
1:A集合元素种类一定 不多于 4 个(最多只有4种数)
2:元素种类小于等于3的,一定能够满足题目要求。
3:元素种类等于4的,较小的两个数的差值,一定等于,较大的两个数的差值。
AC代码:
#include <stdio.h>
#include <stdlib.h>
int differentNum;
int setA[100010],record[5];
int cmp(const void* p1, const void* p2){
return *(int *)p1 - *(int *)p2;
}
int main()
{
int K,n,i,j;
scanf("%d",&K);
while ( K --)
{
differentNum = 0;
scanf("%d",&n);
// 输入
for ( i = 0; i < n; i ++)
scanf("%d",&setA[i]);
// 检查 不同的数 有多少个。
for ( i = 0; i < n; i ++)
{
for ( j = 0; j < differentNum; j ++)
if (record[j] == setA[i])
break;
if (j == differentNum) {record[j] = setA[i], differentNum ++;}
if (differentNum == 5) break;
}
// 如果 difNum = 5,说明有5个不同的数; <=3 在三个数以内,是一定可以
if (differentNum == 5) {puts("No"); continue;}
if (differentNum <= 3) {puts("Yes");continue;}
// 前两个数的差值 = 后两个数的差值,输出yes
qsort(record,4,sizeof(record[0]),cmp); // 偷懒,不想挨个判断和自己写排序
if ((record[1]-record[0]) == (record[3]-record[2]))
puts("Yes");
else puts("No");
}
return 0;
}