ACM之抽屉原理

ACM之抽屉原理_第1张图片
看到这道题时,很有可能会一时不知道该怎么办,但是细细一想,吧这道题转化以下就出来结果了,要使每糖果间隔着吃,故想到到高中的排列组合,运用隔板的方法。我们的目的是将最多的糖果不间隔着其他的糖果吃,故只需要将剩下的糖果来插孔,将他们插在最多的糖果形成的间隔中
设最多的糖果数为max,则至少需要max-1个糖果来插空,注意此题需要用long long类型
附代码
ACM之抽屉原理_第2张图片

//抽屉原理

#include

int main(void)
{
    long long n;
    long long a;
    long long sum;
    long long max=-1;
    long long m;
    long long i;

    scanf("%lld",&m);

    while (m--)
    {
        scanf("%lld",&n);
        max = -1;//可以这样先给max附一个初值
        sum = 0;
        for (i = 0; i < n; i++)
        {
            scanf("%lld",&a);
            sum += a;
            if (a>max)
            {
                max = a;
            }
        }

        if ((sum - max) >= (max - 1))//把最多的当成隔板,则其他糖果最少要max-1颗来填补空缺
        {
            printf("Yes\n");
        }
        else
        {
            printf("No\n");
        }
    }
    return 0;
}

第一抽屉原理
原理1: 把多于n+k个的物体放到n个抽屉里,则至少有一个抽屉里的东西不少于两件。
原理2 :把多于mn(m乘以n)+1(n不为0)个的物体放到n个抽屉里,则至少有一个抽屉里有不少于(m+1)的物体。
原理3 :把无穷多件物体放入n个抽屉,则至少有一个抽屉里 有无穷个物体。
第二抽屉原理
把(mn-1)个物体放入n个抽屉中,其中必有一个抽屉中至多有(m—1)个物体(例如,将3×5-1=14个物体放入5个抽屉中,则必定有一个抽屉中的物体数少于等于3-1=2)。

你可能感兴趣的:(ACM之抽屉原理)