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;
}
}
道阻且长
自己选的路 跪着也要走完