题意:足球比赛中,赢一场加a分,平一场加b分,负一场加c分
n个队伍,两两进行一场比赛,比分前m的晋级,分数相同随机晋级
问某个队伍被淘汰,分数最高多少,某个没被淘汰分数最低是多少
分数最高就让m+1个队伍分数都一样,分数最低就让n-m个队伍分数一样
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
long long n,m;
long long a,b,c;
long long ansx,ansy;
long long sov1(void) {
if(b>=a) { ///如果平均分数比胜利还高,直接全是平局
return (n-1)*b;
}
if(2*b>=a+c) { ///如果平局分数比胜利低,2倍比胜利+失败高,
///前m+1个队伍全是平局(m场比赛)
return (n-m-1)*a+m*b;
}
if(2*b<a+c) { ///如果2倍比胜利+失败低,前m+1个队伍赢一半输一半,
/// 剩下的一场平均或者失败高的一个
long long ans=(n-m-1)*a+(a+c)*(m/2);
if(m&1) ans+=max(b,c);
return ans;
}
}
long long sov2(void) { ///最低分原理差不多。自己推一下
if(c>=b) {
long long ans=(m-1)*b;
if(2*b>=a+c) {
ans+=(a+c)*((n-m)/2);
if((n-m)&1) ans+=min(b,a);
}
else {
ans+=(n-m)*b;
}
return ans;
}
else {
long long ans=(m-1)*c;
if(2*b>=a+c) {
ans+=(a+c)*((n-m)/2);
if((n-m)&1) ans+=min(a,b);
}
else {
ans+=(n-m)*b;
}
return ans;
}
}
int main()
{
int t,kase=0;
scanf("%d",&t);
while(t--) {
scanf("%lld%lld",&n,&m);
scanf("%lld%lld%lld",&a,&b,&c);
ansx=sov1();
ansy=sov2();
printf("Case #%d: %lld %lld\n",++kase,ansx,ansy);
}
return 0;
}