UVA7147_World Cup_思维

题意

n 支队两两比赛,共比赛 n * (n - 1) 场。赢一场得 a 分,输一场得 c 分,平一场得 b 分。得分最高的 m 支队晋级。问被淘汰的最高分最高可能是多少?晋级的最低分最低可能是多少?

思路

先看淘汰最高分,这支队排 m + 1 名。
它和前 m 支队比赛时,为了不超过他们,至多和他们持平。即前 m + 1 支队伍比赛时,尽量使得分数相等。有两种可能,一种是全平,一种是赢一半输一半(如果这个队伍数是奇数,则必有一部分队伍少胜一场,第 m + 1 队必在其中)。两者取较大值。
它和后 n - m - 1 支队伍比赛时,只需要让他的得分尽量高即可。即取全胜或全平中的较大值。

再看晋级最低分,这支队排 m 名。
它和前 m - 1 支队比赛时,只需要让他的得分尽量低即可。即取全负或全平中的较小值。
和后 n - m 支队比赛时,为了不低于他们,至少和他们持平。即后 n - m + 1 支队伍比赛时,尽量使分数相等,具体做法与上面类似。

链接

https://vjudge.net/contest/175446#problem/A

代码

#include<cstdio>
#include<iostream>

using namespace std;

long long t, n, m, a, b, c;

int main()
{
    //freopen("in.txt", "r", stdin);

    cin >> t;
    for(int cas= 1; cas<= t; cas ++)
    {
        cin >> n >> m >> a >> b >> c;
        if(a < c)
        {
            int temp = a;
            a = c, c = temp;
        }

        long long r1 = 0, r2 = 0;
        r1 = max(a, b) * (n - m - 1) + max(m / 2 * b + m / 2 * b, m / 2 * a + m / 2 * c);
        if(m % 2) r1 += max(b, c);
        r2 = min((n - m) / 2 * b * 2, (n - m) / 2 * a + (n - m) / 2 * c) + min(b, c) * (m - 1);
        if((n - m) % 2) r2 += min(a, b);

        cout << "Case #" << cas << ": ";
        cout << r1 << " " << r2 << endl;
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值