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;
}
时间: 2024-12-23 16:40:00

hdu - 4974 - A simple water problem(贪心 + 反证)的相关文章

HDU 4974 A simple water problem(贪心)

HDU 4974 A simple water problem 题目链接 签到题,很容易贪心得到答案是(sum + 1) / 2和ai最大值的最大值 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 100005; typedef long long ll; int t, n; ll a, Max, sum; int main(

HDU - 4974 A simple water problem

Problem Description Dragon is watching competitions on TV. Every competition is held between two competitors, and surely Dragon's favorite. After each competition he will give a score of either 0 or 1 for each competitor and add it to the total score

hdu 4974 A simple water problem(数学题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4974 Problem Description Dragon is watching competitions on TV. Every competition is held between two competitors, and surely Dragon's favorite. After each competition he will give a score of either 0 or

2014多校第十场1004 || HDU 4974 A simple water problem

题目链接 题意 : n支队伍,每场两个队伍表演,有可能两个队伍都得一分,也可能其中一个队伍一分,也可能都是0分,每个队伍将参加的场次得到的分数加起来,给你每个队伍最终得分,让你计算至少表演了几场. 思路 : ans = max(maxx,(sum+1)/2) :其实想想就可以,如果所有得分中最大值没有和的一半大,那就是队伍中一半一半对打,否则的话最大的那个就都包了. 1 #include <cstdio> 2 #include <cstring> 3 #include <st

HDU 4974 A simple water problem 模拟(水

水题. #include <cstdio> #include <iostream> #include <queue> #include <algorithm> using namespace std; typedef long long ll; priority_queue<int> q; int main() { int T, cas = 0; scanf("%d", &T); while(T-- > 0) {

HDOJ 4974 A simple water problem

A simple water problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 173    Accepted Submission(s): 112 Problem Description Dragon is watching competitions on TV. Every competition is held be

HDU 4976 A simple greedy problem. 贪心+DP

题意: 给定n<=1000个小兵,A每次都能使小兵掉1点血,B每次能使所有小兵掉1点血,A.B轮流攻击,每次轮到A他会选择是否攻击,轮到B必须攻击.求A最多能杀死多少小兵.(当小兵血量为1时被攻击到视为被杀死) 思路: 如果所有小兵血量都不一样,A必定能杀死所有小兵.如果有小兵血量相同,那么A必定会攻击一些小兵使他们血量不同.所以我们可以把A的攻击分为两类:用来刚好杀死小兵的一次, 和用来使小兵血量不同的攻击. 我们可以用贪心的思想预处理出怎样用最小的攻击次数让小兵的血量都不同. 然后我们可以用

hdu 1757 A Simple Math Problem (乘法矩阵)

A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2441    Accepted Submission(s): 1415 Problem Description Lele now is thinking about a simple function f(x).If x < 10 f(x) =

HDU 4978 A simple probability problem

A simple probability problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 43    Accepted Submission(s): 14 Problem Description Equally-spaced parallel lines lie on an infinite plane. The sep