World Cup __(UVALive - 7147)

本文介绍了一个比赛得分策略问题的算法实现,通过合理的策略安排来计算参赛者可能获得的最大及最小分数,适用于n个人进行两两对决的比赛场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:n个人互相pk,每个人都要和n-1个人pk,赢了得a分,平了得b分,输了得c分,给出一个m,让你求出排名第(m+1)个人得最高得分以及第m个人得最低得分;

解题思路:首先将n个人分为m,1,(n-m-1),然后要求出这个人得最高得分,首先按照我们正常的思维,如果a<c交换a和c,因为是最高的分,所以首先和后面的人要得ans=(n-m-1)max(b,a);然后和前面的人比可以全平或者赢一半输一半这样是得分最高的时候,另一个也是同样的道理

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
int main()
{
    int T;
    cin>>T;
    int cas=0;
    while(T--)
    {
        cas++;
        ll m,n;
        cin>>n>>m;
        ll a,b,c;
        cin>>a>>b>>c;
        if(a<c)
        swap(a,c);
        ll ans1,ans2;
        ans1=(n-m-1)*max(a,b);
        ans1+=max(m/2*b*2,m/2*a+m/2*c);//这里一定要将m/2之后再乘以2,以防止m是奇数然后还要加一个平局的分
        if(m%2==1)
        ans1+=max(b,c);
        ans2=(m-1)*min(c,b);
        ans2+=min((n-m)/2*b*2,(n-m)/2*a+(n-m)/2*c);
        if((n-m)%2==1)
        ans2+=min(a,b);
        printf("Case #%d: %lld %lld\n",cas,ans1,ans2);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值