• 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;
    }
    
  • 相关阅读:
    Boost Log : Log record formatting
    Boost Log : Attributes
    PLSA的EM推导
    特征处理:一点经验
    海量推荐系统:mapreduce的方法
    操作系统之存储器管理
    maredit测试
    算法:链表
    c++特别要点:多态性与虚函数
    sizeof的用法与字节对齐
  • 原文地址:https://www.cnblogs.com/tpgzy/p/9818865.html
Copyright © 2020-2023  润新知