XTU-OJ 1273-Set

题目描述

对于包含整数多值集合A={a1,a2,⋯,an},执行以下两步操作

  1. 将某些元素加上整数x
  2. 将某些元素减掉整数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;
}

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值