HOHO,终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次吃另一种,这样;可是Gardon不知道是否存在一种吃糖果的顺序使得他能把所有糖果都吃完?请你写个程序帮忙计算一下。
题解:我们先看看输入:
第一行有一个整数T,接下来T组数据,每组数据占2行,第一行是一个整数N(0<N<=1000000),第二行是N个数,表示N种糖果的数目Mi(0<Mi<=1000000)。
这样的输入sum值如果定义为int肯定会爆的,这就是我踩得坑点!!!
总结:以后sum之类的变量直接ll。
方法很简单了,虽然我不知道术语“鸽巢原理”,但是道理明白,就像是在插空格,我们让数量最大的糖果出列,假设有n粒,站立成一排,这样就至少产生n-1个空格,现在我们要做的事情就是利用我们手上所有剩余其他种类的糖果去填塞这些位置,如果不够,输出No,反之,输出Yes.
#include <iostream>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--){
int N,m=0;
long long sum=0;
cin>>N;
while(N--){
int t;
cin>>t;
sum+=t;
m=max(m,t);
}
if(sum-m<m-1)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
return 0;
}