http://acm.hdu.edu.cn/showproblem.php?pid=1205

max为最大堆数量,s为总数。

保证max-(s-max)=2*max-s<=1即可,因为只要能保证最大堆数量和其他堆数量差在一个以内,就可以做到别的堆拿一个最大堆拿一个(剩下yy)这种操作。

View Code
#include <stdio.h>
int a[1100000];
int main()
{
    int t,n;
    int i;
    __int64 s;
    int max;
    scanf("%d",&t);
    while(t--)
    {
        s=max=0;
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            scanf("%d",a+i);
            if(max<a[i])max=a[i];
            s+=a[i];
        }
        printf(2*max-s<=1?"Yes\n":"No\n");
    }
    return 0;
}