题目描述

已知石头剪刀布的规则是:布赢石头,石头赢剪刀,剪刀赢布。
每局胜者得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;
}