AGC016B Colorful Hats(构造)

题目大意:

给定n和n个数,每个数a[i]代表除了i外序列中颜色不同的数的个数,问能否构造出来这个数列。

 

比较简单,首先先求出来a数列的最大值Max,

如果有数小于Max-1,那么显然是不存在的

接下来就是有m个数等于Max-1,n-m个数等于Max

那么可以知道m个数中每个数肯定是有且只有一种颜色

所以m<Max,剩下的必须至少有2个,所以条件就是m<Max && m + 2*(Max-m) <= n

特殊情况:所有数都等于Max,这时候有2种情况,一种是每个数都是不同的,一种是2*Max <= n,判断一下就好

 

#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
using namespace std;
int n;
int a[1000000];
map<int, int>M;
int main()
{
    cin>>n;
    for(int i = 0; i < n; i++) cin>>a[i];
    int Max = 0, t = 0;
    for(int i = 0; i < n; i++){
        if(!M[a[i]]) { M[a[i]] = 1; t++; Max = max(Max, a[i]); }
    }
    for(int i = 0; i < n; i++) if(a[i] < Max-1) { cout<<"No"<<endl; return 0; }
    if(t > 2) { cout<<"No"<<endl; }
    else {
        int m = 0;
        for(int i = 0; i < n; i++) if(a[i] == Max-1) m++;
        if(m == 0) {
            if(2*(Max-m) <= n) cout<<"Yes"<<endl;
            else if(Max == n-1) cout<<"Yes"<<endl;
            else cout<<"No"<<endl;
            return 0;
        }
        if(m < Max && (m + 2*(Max-m) <= n)) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
}

 

posted @ 2017-06-19 13:42  Saurus  阅读(142)  评论(0编辑  收藏  举报