UVALive 7147-World Cup-数学推导-水题

来源:互联网 发布:ubuntu命令行界面 编辑:程序博客网 时间:2024/06/16 12:58

题意:足球比赛中,赢一场加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;}


0 0
原创粉丝点击