[AGC016B] Colorful Hats (结论)

本文针对一个有趣的问题进行了探讨,即如何根据每个人所看到的其他人帽子颜色的数量来判断是否存在一种分配方案,使得每个人的说法都能成立。文章给出了详细的逻辑分析,并提供了一个简洁的C++实现。

Description

有n个人,每个人都戴着一顶帽子。当然,帽子有不同的颜色。

现在,每个人都告诉你,他看到的所有其他人的帽子共有多少种颜色,请问你有没有符合所有人的描述的情况。

Input

第一行一个整数n。

第二行n个整数,第i个数ai表示第i个人看到的所有其他人帽子颜色的种数。

Output

若存在一种情况满足条件,输出"Yes",否则输出"No"。(均不含引号)

题解:

看起来就像是(玄学)结论题……

首先很明显的是,最大值和最小值的差不能大于1。

那我们先考虑最大值等于最小值的情况,首先全部都是1或者n-1都是合法的。

那其他的,每种颜色至少要有两顶或以上的帽子(任取一种可以看到的为另外几个和自己一样的和其他不同的)

那只要 \({n \over 颜色数}\geq 2\),即为合法。

那如果最大值不等于最小值,那么小的的那些帽子的颜色肯定都是独一无二的。

大的颜色肯定每种颜色的帽子都至少要有两顶。

那么把小的颜色总数减去,剩下的颜色填到剩下的空位去,看看能不能使剩下的颜色每种都有至少两个。

CODE:

#include<iostream>
#include<cstdio>
using namespace std;

int n,x,cnt=0;
int minv=1e9,maxv=-1e9;

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&x);
        if(x==minv)cnt++;
        if(x<minv)minv=x,cnt=1;
        if(x>maxv)maxv=x;
    }
    if(maxv-minv>1)return printf("No"),0;
    if(maxv==minv){
        if(minv==n-1)return printf("Yes"),0;
        return printf(n/minv>=2?"Yes":"No"),0;
    }
    int a=n-cnt,b=maxv-cnt;
    if(b<1)return printf("No"),0;
    return printf(a/b>=2?"Yes":"No"),0;
}

转载于:https://www.cnblogs.com/ezoiLZH/p/9507829.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值