您的位置:首页 > 其它

HDU 1205 吃糖果

2015-08-12 18:23 387 查看
题目地址:点击打开链接

思路:参考别人的,仔细想想其实不那么难的

把最多的那种 M(共计max个) 摆成一列,产生max-1个间隔,对于M来说,其他的糖果都是异类 (共计 sum-max个),可以用来填充间隔,但是如果sum-max<max-1的话,间隔不

能被填满,所以会有相邻的M,不符合要求 printf("No\n");

当sum-max>=max-1时,M的间隔一定能被填满  printf("Yes\n");

注意sum数值较大

 

在异类中任选一种糖果N (N<=sum-max) 填进间隔 ,之后M与N合并代替之前的M。

循环上一步直至结束

MMMMM    NNNN   BBBB   VVV   CC   X

 

 

从箭头处开始插入

   ↓

M  M  M  M  M    

                                   ↓

MN  MN  MN  MN  M

                                   ↓

MNB  MNB  MNB  MN  MB

                    ↓

MNBV  MNB  MNB  MNV  MBV

                                              ↓

MNBV  MNBC  MNBC  MNV  MBV

                              

MNBV  MNBC  MNBC  MNVX  MBV

   1.把某种糖果看做隔板,如果某种糖果有n个,那么就有n+1块区域,至少需要n-1块其他种糖果才

能使得所有隔板不挨在一块..也就是说能吃完这种糖果.至少需要其他种类糖果n-1块..(鸽巢原理)

    2.数量最多的糖果(隔板)可以构造最多的空间,如果这种糖果有maxn个....那么需要maxn-1个其

他种糖果.对于某种数量少于maxn的糖果来说,可以在原本数量最多的糖果构造的隔板上"加厚"原

有的隔板...,那么这"某种糖果"就销声匿迹了.....

    

    考虑极端情况.如果某种糖果无法在这maxn+1的空间内构造出符合条件的序列,那么这种糖果至

少要有maxn+1+1个(考虑只有两种糖果的情况)...(鸽巢原理)...但是这与数量最多的那种糖果只有

maxn个矛盾.....(maxn+1+1>maxn 这不等式不难理解吧....).

AC代码:

#include<stdio.h>

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