HDU1205吃糖果

spoiler posted @ 2011年3月31日 19:53 in 未分类 , 1940 阅读

题目思路:

我们发现,如果最大堆-次大堆<=1,那么问题肯定有解:我们可以从最大和次大里面每次拿一个,然后等他们和第三大堆相等的时候,每次从三堆里面各拿一个,等他们和第四大堆相等的时候,每次从四堆里面各拿一个,这样一直拿完所有堆。

问题变成了能不能使得最大堆-次大堆<=1,所以之前我们会从次大堆之外的那些堆里面取,来让最大堆减少,如果能减到:最大堆-次大堆<=1,那么原问题有解。

能否减到要看:

sum - max - max2 >= max - max2 - 1

是否成立,其中sum为总和,max为最大堆,max2为次大。

整理得:

2 * max - sum <= 1

应该这样就可以了。

源程序代码:

#include<stdio.h>
int main()
{
    long n,m,x,max;
    long sum;
    scanf("%d",&n);
    while(n--)
   {
        scanf("%d",&m);
        sum=0;
        max=0;
        while(m--)
         {
           scanf("%d",&x);
           sum+=x;
           if(max<x)
      max=x;
         }
   max<=sum-max+1?    
    printf("Yes\n"): printf("No\n");
    }
return 0;
}

 


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter