AT2386 Colorful Hats (乱搞题,思维题)

分情况讨论的神题...
max不等于min + 1 或者不等于min,这种情况显然不存在.
如果都等于一个数
有两种情况:
互相独立,那么a[i]肯定==n-1
有相同的,那么a[i]一定不是独立的.
那么就会有a[i]即为出现颜色的总个数.
因为又不是独立的.所以每种颜色至少出现两次.
所以满足\(2 * a[i] <= n\)即可.
继续分析,如果max == min + 1的情况.
n : 人数
一个点至少能看到有max - 1种颜色.
max : 能看到最多的颜色. (总颜色)
max - 1 : 本身是独立的颜色
设cnt 为max - 1出现的个数.
那么cnt就是出现的独立颜色.
把这些点剔除.
那么n = n - cnt
下文中的n 都变成了 n - cnt
max - cnt就是剩下的颜色个数
剩下的颜色个数至少满足两个人拥有同一颜色.(相互不独立,转化为上面的问题)
所以当2 * (max - cnt) <= n的时候是有解得.
所以不独立颜色个数是本题解题的关键.
但是再WA了十几遍后,终于发现了\(BUG\)所在.漏了一种情况.
当cnt >= maxx的时候(cnt == maxx的时候不存在合法情况.也要算上)是不合法的情况.
然后就A了.......

#include <iostream>
#include <cstdio>
#define gc getchar()
#define pc putchar
#define rep(i,x,p) for(int i = x;i <= p;++ i)
#define sep(i,x,p) for(int i = x;i >= p;-- i)
using namespace std;
const int maxN = 1e5 + 7;

int a[maxN];

inline int read() {
    int x = 0 ,f = 1;char c = gc;
    while(c < '0' || c > '9') {if(c == '-')f = -1;c = gc;}
    while(c >= '0' && c <= '9') {x = x * 10 + c - '0';c = gc;}
    return x * f;
}

void print(int x) {
    if(x < 0) {
        pc('-');
        x = -x;
    }
    if(x >= 10) print(x / 10);
    pc(x % 10 + '0');
}

int main() {
    int n,maxx = 0, minn = 1e6;
    n = read();
    rep(i,1,n) a[i] = read();
    rep(i,1,n) maxx = max(maxx,a[i]);
    rep(i,1,n) minn = min(minn,a[i]);
    if(maxx != minn + 1 && maxx != minn)  {puts("No");return 0;}
    if(maxx == minn) {
        if(a[1] == n - 1 || 2 * a[1] <= n) puts("Yes");
        else puts("No");
        return 0;
    }
    int cnt = 0;
    rep(i , 1 , n) if(a[i] == minn) cnt ++;
	if(cnt >= maxx || 2 * (maxx - cnt) > n - cnt) puts("No");
	else puts("Yes");
    return 0;
}
posted @ 2018-10-19 21:15  Rlif  阅读(203)  评论(1编辑  收藏  举报