hello kity
期待您的批阅,由于写解题报告时 不一定考虑的很周到,所以如果您有什么不懂的地方,请您留言,然而一天之内我肯定会看见您信息,再对代码注释详细,让您更好的阅读
分类
最新评论
最新留言
链接
RSS
计数器
223498
功能
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; }