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。。

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <cstdio>  
  2.   
  3. int ReadInt()  
  4. {  
  5.     int ret = 0;  
  6.     char ch;  
  7.   
  8.     while ((ch = getchar()) && ch >= '0' && ch <= '9')  
  9.     {  
  10.         ret = ret * 10 + ch - '0';  
  11.     }  
  12.   
  13.     return ret;  
  14. }  
  15.   
  16. int main()  
  17. {  
  18.     int T, N, a, kase = 0;  
  19.   
  20.     scanf("%d", &T);  
  21.     getchar();  
  22.   
  23.     while (T--)  
  24.     {  
  25.         long long sum = 0;  
  26.         long long ret = 0;  
  27.   
  28.         N = ReadInt();  
  29.         while (N--)  
  30.         {  
  31.             a = ReadInt();  
  32.             sum += a;  
  33.             if (a > ret)  
  34.             {  
  35.                 ret = a;  
  36.             }  
  37.         }  
  38.         if (sum & 1)  
  39.         {  
  40.             sum++;  
  41.         }  
  42.         sum >>= 1;  
  43.         if (sum > ret)  
  44.         {  
  45.             ret = sum;  
  46.         }  
  47.   
  48.         printf("Case #%d: %I64d\n", ++kase, ret);  
  49.     }  
  50.   
  51.     return 0;  
  52. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值