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

来源:互联网 发布:总量控制 结构优化 编辑:程序博客网 时间:2024/06/07 02:36

题意: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;}


3 2
原创粉丝点击