HDU 1205 吃糖果(鸽巢定理)

题目链接

Problem Description

HOHO,终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次吃另一种,这样;可是Gardon不知道是否存在一种吃糖果的顺序使得他能把所有糖果都吃完?请你写个程序帮忙计算一下。

Input

第一行有一个整数T,接下来T组数据,每组数据占2行,第一行是一个整数N(0<N<=1000000),第二行是N个数,表示N种糖果的数目Mi(0<Mi<=1000000)。

Output

2
3
4 1 1
5
5 4 3 2 1

Sample Output

No
Yes

Hint

Please use function scanf

这道题的大致意思就是给你t组数据,每组n个数,每个数代表第i种糖果有多少,同时他不能够连续吃同一种糖果。
这道题是典型的鸽巢定理,用隔板法来求解。
首先我们先设其中最多的糖果种类数为M,其他糖果数为S
分为两种情况:1.M-1>S,我们将S的其他糖果用M的糖果当隔板一一分开,那么最后的必用两个M个连续在一起。
2.M-1<=S,必有解。把S个糖果排在一个长队,同种类的挨在一起,然后将M作为隔板,由于隔板的数量比每一个糖果多,所以,不可能有连续的两个糖果在一起,隔板之间可以用放多种糖果。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn=1000005;
typedef long long LL;
LL a[maxn];
int main(){
	int t;
	cin>>t;
	while(t--){
		int n;
		cin>>n;
		LL max1=0;
		LL sum=0;
		for(int i=1;i<=n;i++){
			cin>>a[i];
			sum+=a[i];
			max1=max(a[i],max1);
		}
		if(max1-1>sum-max1)cout<<"No"<<endl;
		else cout<<"Yes"<<endl;
	}
} 

道阻且长
自己选的路 跪着也要走完

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值