题解:B4391 [常州市赛 2025] 拖拉机

· · 题解

点开算法标签,我们不难发现这道题其实就是模拟题,不要被题面吓住了,如果你实在没读懂可以玩一局去

部分思路:

1. ‌谁要给钱谁要收钱‌:

因为我写的代码用的变量有点繁琐,所以每个变量的用途我都做好注释了,方便各位理解。

另外我也尽量地将代码写得通俗易懂些,希望这篇题解能够帮到你。

AC 记录。

AC 代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    //a:1号初始欢乐豆
    //b:2号初始欢乐豆
    //c:3号初始欢乐豆
    //d:4号初始欢乐豆
    //e:胜方应获得的欢乐豆总数
    int a,b,c,d,e;
    cin>>a>>b>>c>>d>>e;
    int l2=min(b,e);//l2:2号输豆量
    int l4=min(d,e);//l4:4号输豆量
    int f=l2+l4;//f:总输豆量
    int w1=min(a,f/2);//w1:1号最终胜豆量
    int w3=min(c,f/2);//w3:3号最终胜豆量 
    int sum=w1+w3;//sum:胜方实际获得的欢乐豆总量
    int cnt=f-sum;//cnt:需要返还的剩余欢乐豆数量
    //返还(画重点奥)
    /*
    如果sum<f,说明需要返还差额cnt=f-sum
    优先返还给输得较多的一方
    当两家输豆相同时,平分剩余欢乐豆
    */ 
    while(cnt>0){
        if(l2<l4){
            int ccnt=min(cnt,l4-l2);//ccnt:还的欢乐豆数量
            l4-=ccnt;
            cnt-=ccnt;
        }
        else if(l4<l2){
            int ccnt=min(cnt,l2-l4);
            l2-=ccnt;
            cnt-=ccnt;
        } 
        else{
            l2-=cnt/2;
            l4-=cnt/2;
            if(cnt%2!=0){
                l4--; //处理奇数情况
            }
            cnt=0;
        }
    }
    int fa=a+w1;//fa:1号最终欢乐豆 
    int fb=b-l2;//fb:2号最终欢乐豆
    int fc=c+w3;//fc:3号最终欢乐豆
    int fd=d-l4;//fd:4号最终欢乐豆
    cout<<fa<<" "<<fb<< " "<<fc<<" "<<fd<<endl;
    return 0;
}