hdu - 4974 - A simple water problem(贪心 + 反证)

Posted yfceshi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu - 4974 - A simple water problem(贪心 + 反证)相关的知识,希望对你有一定的参考价值。

题意:N个队(N <= 100000),每一个队有个总分ai(ai <= 1000000),每场比赛比赛两方最多各可获得1分,问最少经过了多少场比赛。

题目链接:http://acm.hdu.edu.cn/showproblem.php?

pid=4974

——>>我们应该尽量使每场比赛的得分为1 : 1。这样能够达到最少的比赛场数(不小于单个队伍的分数)。

如果有2场比赛的比分为1 : 0,

1)a : b = 1 : 0,c : d = 1 : 0。这时能够安排a : c = 1 : 1。仅仅需1场就可达到同样的分数。

2)a : b = 1 : 0。a : c = 1 : 0,取另外一场比赛d : e = 1 : 1,这时可安排a : d = 1 : 1,a : e = 1 : 1,仅仅需2场就可达到同样的分数。

因此,没有最多有1场比赛的比分为 1 : 0。其它比赛的比分都为 1 : 1,因此。结果 = max(单个队伍最高分数, (全部分数和 + 1) / 2)。。。(注意范围:10 ^ 5 * 10 ^ 6 > 2 ^ 31 - 1)

virtual contest上提交必须开输入挂才不会TLE。。技术分享

hdu题库4974中 scanf 就能够AC。。

#include <cstdio>

int ReadInt()
{
    int ret = 0;
    char ch;

    while ((ch = getchar()) && ch >= '0' && ch <= '9')
    {
        ret = ret * 10 + ch - '0';
    }

    return ret;
}

int main()
{
    int T, N, a, kase = 0;

    scanf("%d", &T);
    getchar();

    while (T--)
    {
        long long sum = 0;
        long long ret = 0;

        N = ReadInt();
        while (N--)
        {
            a = ReadInt();
            sum += a;
            if (a > ret)
            {
                ret = a;
            }
        }
        if (sum & 1)
        {
            sum++;
        }
        sum >>= 1;
        if (sum > ret)
        {
            ret = sum;
        }

        printf("Case #%d: %I64d\n", ++kase, ret);
    }

    return 0;
}




以上是关于hdu - 4974 - A simple water problem(贪心 + 反证)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1757 A Simple Math Problem

?HDU 5795 A Simple Nim(简单Nim)

A Simple Math Problem HDU - 5974

HDU-1851-A Simple Game

hdu 5974 A Simple Math Problem

hdu4976 A simple greedy problem.