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

    xiaoxiao2025-02-18  16

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

    转载请注明原文地址: https://ju.6miu.com/read-1296555.html
    最新回复(0)