码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1205

时间:2018-11-09 00:02:44      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:div   假设   并且   顺序   long   快排   i++   click   循环   

先上题目

 

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

Input第一行有一个整数T,接下来T组数据,每组数据占2行,第一行是一个整数N(0<N<=1000000),第二行是N个数,表示N种糖果的数目Mi(0<Mi<=1000000)。 
Output对于每组数据,输出一行,包含一个"Yes"或者"No"。 
Sample Input

2
3
4 1 1
5
5 4 3 2 1

Sample Output

No
Yes

 ——————————————————————————————————————————————————————————————————————————————————————————

 

一开始的思路是建立一个数组,然后快排,之后循环一个个减一,如果最后只剩下一种糖果,并且只剩下一颗,那就是Yes。不过!超时了(其实自己心里也有B数会超时)。

后面发现了鸽巢原理.

 

思路:

  把   最大数的糖果   每两个中间隔开一个空,假设最大数为n,所以中间就有了n-1个空。

  然后就可以把其它的  糖果   一种种,插入空中。

  也就是说 如果 空 能 填满,那就成立,不然就炸了。

  所以 其它的糖果的总数  >=  最大数的糖果,就成立了。

  例如5 4 3 2 1

  那就可以 分成   5——5——5——5——5

  然后插空   54——54——54——54——5

  再插空    543——543——543——54——5

  接着     5432——5432——543——54——5

  最后     54321——5432——543——54——5

  OK,就是这样了!下面贴代码。

 

#include<stdio.h>
#include<stdlib.h>
int a[1000010];
int main()
{
int x;
scanf("%d", &x);
while (x--)
{
memset(a, 0, sizeof(a));
int n,max=0;
long long sum = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
sum += a[i];
if (a[i] > max) { max = a[i]; }
}
sum -= max;
max--;
if (max <= sum) { printf("Yes\n"); }
else
{
printf("No\n");
}
}
return 0;
}

HDU 1205

标签:div   假设   并且   顺序   long   快排   i++   click   循环   

原文地址:https://www.cnblogs.com/caibingxu/p/9932727.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!