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