您的位置:首页 > 编程语言 > C语言/C++

【HDU】1205 吃糖果

2018-03-20 22:13 253 查看
 
[align=left]Problem Description[/align]HOHO,终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次吃另一种,这样;可是Gardon不知道是否存在一种吃糖果的顺序使得他能把所有糖果都吃完?请你写个程序帮忙计算一下。[align=left]Input[/align]第一行有一个整数T,接下来T组数据,每组数据占2行,第一行是一个整数N(0<N<=1000000),第二行是N个数,表示N种糖果的数目Mi(0<Mi<=1000000)[align=left]Output[/align]对于每组数据,输出一行,包含一个"Yes"或者"No"。[align=left]Sample Input[/align]
2
3
4 1 1
5
5 4 3 2 1[align=left]Sample Output[/align]
No
Yes     这道题题意大概就是给你几种糖果,每个糖果有多少个,这些糖果可不可以每次吃的相邻的两个糖果都不是同一种。
    这道题我想到的是插空的方法,类似于组合数学中鸽巢原理的几种形式中的一种。在网上查了一些别人的做法,基本也都是用鸽巢原理,大同小异。
    什么是鸽巢原理呢?其实最初的原理就是有n+1只鸽子飞到n个笼子里,那么一定有一个笼子里面有2只。

    在这里,其实就是另外一种表达形式。找到数量最多(max)的糖果代表鸽子,其他糖果的总数代表挡板。若想要两只鸽子不在一起,那么至少要有max-1个挡板。

代码:#include <stdio.h>

int main() {
int T;
long long N,n;
scanf("%d",&T);
while (T--) {
long long sum=0,max=-1;
scanf("%lld",&N);
while (N--) {
scanf("%lld",&n);
sum+=n;
if (n>max)
max=n;
}
if ((sum-max)>=(max-1))
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C语言