• [agc016B][Colorful Hats]


    题目链接

    思路

    首先,如果没人说谎那么序列中肯定只有一大一小两种数,假设大的数为x,小的数为y。因为对于每个人只有两种情况,要么自己与除自己外的某个人拥有相同的颜色,此时总颜色数就是这个人所能看到的颜色数量。要么这个人单独拥有一种颜色,此时总颜色数就是这个人所能看到的数量+1。所以x和y相差一定小于等于1。我们分别统计出x和y的数量,因为x的人都是单独拥有一种颜色,所以看到y的人所能拥有的颜色数就是用总颜色数tot-x。因为看到y的人至少是两个人一种颜色,所以tot-x要小于toty/2才行,否则就一定有某个人拥有单独的一种颜色,就不对了。

    代码

    #include<cstdio>
    #include<iostream>
    #define fi(s) freopen(s,"r",stdin);
    #define fo(s) freopen(s,"w",stdout);
    using namespace std;
    typedef long long ll;
    const int N = 1000000 + 5;
    ll read() {
    	ll x = 0,f = 1;char c = getchar();
    	while(c < '0' || c > '9') {
    		if(c == '-') f = -1;
    		c = getchar();
    	}
    	while(c >= '0' && c <= '9') {
    		x = x * 10 + c - '0';
    		c = getchar();
    	}
    	return x * f;
    }
    int a[N];
    int Min,Max,Minjs,Maxjs;
    int main() {
    	int n = read();
    	Min = N; Max = -1;
    	Minjs = Maxjs = 0;
    	for(int i = 1;i <= n;++i) {
    		a[i] = read();
    		Min = min(Min,a[i]); Max = max(Max,a[i]);
    	}
    	if(Max - Min > 1) {
    		puts("No");//continue; ret
    		return 0;
    	}
    	if(Min == Max) {
    		if(Min + 1 == n || Min <= (n>>1)) puts("Yes");
    		else puts("No");
    		return 0;
    	}
    	for(int i = 1;i <= n;++i) {
    		if(a[i] == Min) Minjs++;
    		if(a[i] == Max) Maxjs++;
    	}
    	if(Max <= Minjs) {
    		puts("No");
    		return 0;
    	}
    	Max -= Minjs;
    	if(Max > (Maxjs >> 1) ) {
    		puts("No"); 
    		return 0;
    	}
    	puts("Yes");
    	return 0;
    }
    

    一言

    所谓的奇迹,要真的发生才有价值。 ——新世纪福音战士

  • 相关阅读:
    echarts各个配置项详细说明总结
    享元模式
    观察者模式
    策略模式
    桥接模式
    适配器模式
    建造者模式
    原型模式
    单例模式
    Java8新特性——集合底层源码实现的改变
  • 原文地址:https://www.cnblogs.com/wxyww/p/9820382.html
Copyright © 2020-2023  润新知