题意:世界杯上有一个小组有n支球队,m支可以晋级,赢 平 输 所得的分数分别是a b c
问你两个可能,一种是没晋级可能得到的最大分值 第二种是晋级了可能得到的最小分值
思路:
先讨论最高不晋级分数,我们考虑把N个人分成m,1,n-m-1个人,那么中间那个人的分数就是答案,那么中间这个人和后半部分的人的比赛结果一定是要么全赢,要么全平,ans+=(n-m-1)*max(a,b),而与前面的人比赛,既然需要最高不晋级分,那么就可能和前面的人赢输对半,或者全平,ans+=max(m/2*a+m/2*b,m/2*b+m/2*b),而当m是奇数的时候,则多一轮,显然这轮的结果只能是平或者输,不然的话就会超越前面的一个人了,最低晋级分数同理
ac代码:
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int t;
cin>>t;
int p=0;
while(t--)
{
long long n,m,a,b,c;
cin>>n>>m;
cin>>a>>b>>c;
long long max1;
max1=(n-m-1)*max(a,max(b,c));
if(m%2==0)
{
max1+=(max(m*b,m/2*(a+c)));
}
else
{
max1+=((max(m/2*2*b,m/2*(a+c)))+max(b,min(a,c)));
}
long long min1;
min1=(m-1)*min(a,min(b,c));
if((n-m)%2==0)
{
min1+=min((n-m)*b,(n-m)/2*(a+c));
}
else
{
min1+=(min((n-m)/2*2*b,(n-m)/2*(a+c))+min(b,max(a,c)));
}
printf("Case #%d: ",++p);
cout<<max1<<" "<<min1<<endl;
}
return 0;
}