题目是问从n个球队中选拔m个球队,每个球队都会和其他球队进行一场比赛,比赛会有输赢平三种结果,分别对应不同的得分。
不能晋级的最高得分和能晋级的最低得分。
是一个有多种情况的贪心+构造问题。
首先将所有球队分为3部分m, 1, n - m - 1,同时开头处理保证赢的得分比输的大。
假设中间那个人就是不能晋级的最高得分,他和前m个人一样要获得一个基础分,即和被淘汰的队伍总是赢或者总是平
即 score_high += (n - m - 1) * max{a, b}
与晋级的队伍比赛,最好的办法自然是输赢相同,或者都是平局,即
score_high += max{m / 2 * (a + c), m * b}
当m为奇数时,那一句一定是输或者是平局。最小得分处理方法类似。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
int T;
scanf("%d", &T);
int kase = 0;
while(T--){
LL n, m, a, b, c;
LL ans1 = 0, ans2 = 0;
cin >> n >> m >> a >> b >> c;
printf("Case #%d: ", ++kase);
if(a < c) swap(a, c);
ans1 = (n - m - 1) * max(a, b);
LL tmp1 = m / 2 *(a + c);
LL tmp2 = m / 2 *(b + b);
ans1 += max(tmp1, tmp2);
if(m & 1) ans1 += max(b, c);
ans2 += (m - 1) * min(b, c);
tmp1 = (n - m) / 2 * (a + c);
tmp2 = (n - m) / 2 * (b + b);
ans2 += min(tmp1, tmp2);
if((n - m) & 1) ans2 += min(a, b);
cout << ans1 << ' ' << ans2 << endl;
}
return 0;
}