专栏文章
题解:B4391 [常州市赛 2025] 拖拉机
B4391题解参与者 7已保存评论 6
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @mio4ww6o
- 此快照首次捕获于
- 2025/12/02 13:25 3 个月前
- 此快照最后确认于
- 2025/12/02 13:25 3 个月前
点开算法标签,我们不难发现这道题其实就是模拟题,不要被题面吓住了,如果你实在没读懂可以玩一局去。
部分思路:
1. 谁要给钱谁要收钱:
- 2号和4号是输家,要给钱。
- 1号和3号是赢家,要收钱。
2. 结算钱的规则:
- 输家最多给光自己所有的钱(不能欠债)。
- 赢家最多收输家给的总钱数的一半(不能多收)。
3. 特殊情况的处理:
- 如果赢家钱包装不下那么多钱。
- 就把多算的钱退还给输家。
- 优先退给输得更多的人。
4.最后的结果:
- 赢家:原来的钱加上赢的钱。
- 输家:原来的钱减去输的钱。
因为我写的代码用的变量有点繁琐,所以每个变量的用途我都做好注释了,方便各位理解。
另外我也尽量地将代码写得通俗易懂些,希望这篇题解能够帮到你。
AC 代码:
CPP#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;
}
相关推荐
评论
共 6 条评论,欢迎与作者交流。
正在加载评论...