C 石头剪刀布
题目描述
已知石头剪刀布的规则是:布赢石头,石头赢剪刀,剪刀赢布。
每局胜者得2分,平局双方各得1分,败者不得分。
牛牛和牛妹一共玩了局石头剪刀布,他们不记得每局自己出的是什么,只记得自己一共出了多少个石头、多少个剪刀、多少个布。
牛牛想知道,自己最高可能得多少分?
输入描述
第一行一个正整数n,代表游戏的总局数。
第二行三个整数a1,b1,c1,分别代表牛牛出的石头数、剪刀数和布数。
第三行三个整数a2,b2,c2,分别代表牛妹出的石头数、剪刀数和布数。
输出描述
牛牛最高可能的得分。
示例1
输入
3
3 0 0
0 3 0
输出
6
说明
牛牛出了3局石头,牛妹出了3局剪刀,显然牛牛全胜。
示例2
输入
2
1 1 0
1 0 1
输出
3
说明
牛牛石头对牛妹石头,牛牛剪刀对牛妹布,这样牛牛一共得3分。
可以证明这样分配牛牛得分是最高的。
备注
对于20%的数据,
对于50%的数据,
对于100%的数据,n≤10^9,且所有数据均满足
解法
思考
如果牛牛有石头,最好的办法就是用来抵牛妹的剪刀,这样可以赢两分。
只需要判断一下牛牛石头(a1)与牛妹剪刀(b2)的最小值vec,就是牛牛可以用石头获胜的最多局数。
得分ans就增加2*vec,a1与b2的胜于数量就都减少vec。
牛牛的剪刀与布同理,先用掉可以获得最大分数的次数。
之后如果还有次数剩余,最好的方法就是平局,因为已经不可能再获胜了。
如果牛牛还有石头,最好的办法就是用来抵牛妹的石头,这样可以赢一分。
只需要判断一下牛牛石头(a1)与牛妹石头(a2)的最小值vec,就是牛牛可以用石头平局的最多局数。
得分ans就增加vec,a1与a2的胜于数量就都减少vec。
牛牛的剪刀与布同理,先用掉可以获得最大分数的次数。
之后如果次数仍有剩余,就不再考虑了。
因为输了也不扣分,并且不可能再赢或平局了。
AC代码
#include<bits/stdc++.h> using namespace std; int main() { int n,s1,j1,b1,s2,j2,b2; scanf("%d%d%d%d%d%d%d",&n,&s1,&j1,&b1,&s2,&j2,&b2); long long ans=0; //牛牛石头赢牛妹剪刀 int vec=min(s1,j2); ans+=vec*2; s1-=vec,j2-=vec; //牛牛剪刀赢牛妹的布 vec=min(j1,b2); ans+=vec*2; j1-=vec,b2-=vec; //牛牛的布赢牛妹石头 vec=min(b1,s2); ans+=vec*2; b1-=vec,s2-=vec; //牛牛石头平牛妹石头 vec=min(b1,b2); ans+=vec; b1-=vec,b2-=vec; //牛牛剪刀平牛妹剪刀 vec=min(s1,s2); ans+=vec; s1-=vec,s2-=vec; //牛牛的布平牛妹的布 vec=min(j1,j2); ans+=vec; j1-=vec,j2-=vec; printf("%lld\n",ans); return 0; }