BNUOJ 34968 石头剪子布

1000ms
1000ms
65536KB
64-bit integer IO format:  %lld      Java class name:  Main

Mochavic很喜欢玩石头剪子布,某天他叫了一个小伙伴来和他玩。在玩之前他们约定好,两人总共玩N局。Mochavic总共只能出R1次石头,S1次剪刀,P1次布;他的小伙伴总共只能出R2次石头,S2次剪刀,P2次布(R1+S1+P1=R2+S2+P2=N)。如果某一局Mochavic获胜则他的得分+1,如果是平局则得分不变,如果输了得分-1。现在Mochavic想知道N局过后自己得分的最大值和最小值分别是多少。

 

Input

输入的第一行为一个整数T(T≤1000)表示数据组数。接下来T行每行6个非负整数R1,S1,P1,R2,S2,P2,(R1+S1+P1在int范围内,R1+S1+P1=R2+S2+P2)。

 

Output

对于每组数据输出两个数表示得分的最大值和最小值。

 

Sample Input

2
1 1 1 1 1 1
3 0 0 0 3 0

Sample Output

3 -3
3 3

这是一个看起来非常恐怖,但是想明白了之后就非常简单的题。
首先举个例子:
比如A出的石头剪刀布(依次,下同)为:4,5,6;B出的为5,6,4;
那么为了A赢得多,首先肯定尽量满足A赢。于是最开始得分为4+4+5=13分;
而这样下来之后,A还剩0,1,1;B还剩0,2,0;
这个时候很多人开始纠结到底怎么才扣分最少;
其实从这个例子我们就可以发现,无论怎样,A肯定平一局输一局,得分-1;
所以最后最多得分为12分;
最少得分只用求出B的最多得分,然后取负数就可以了。

代码如下:
#include <stdio.h>
#include <fstream>
#include <string.h>
#include <iostream>
#include <math.h>
#include <algorithm>
#include <vector>
#include <map>
#define PI acos(-1.0)
#define M 1000005  //10^6
#define eps 1e-8
#define moo 1000000007
using namespace std;
//a>b>c
int main()
{
    int a1,a2,a3,a4,b1,b2,b3,b4,c1,c2,c3,c4,d1,d2,d3,d4,T;
    while(scanf("%d",&T)!=EOF)
    {   
        while(T--)
        {
        scanf("%d%d%d",&a1,&b1,&c1);
        scanf("%d%d%d",&a2,&b2,&c2);
        a3=a1;a4=a2;
        b3=b1;b4=b2;
        c3=c1;c4=c2;
        int xans=0;
        int nans=0;

        xans=xans+min(a1,b2);
        if(a1>b2)
        {
            a1=a1-b2;b2=0;
        }
        else
        {
            b2=b2-a1;a1=0;
        }
        xans=xans+min(b1,c2);
        if(b1>c2)
        {
            b1=b1-c2;c2=0;
        }
        else
        {
            c2=c2-b1;b1=0;
        }
        xans=xans+min(c1,a2);
        if(c1>a2)
        {
            c1=c1-a2;a2=0;
        }
        else
        {
            a2=a2-c1;c1=0;
        }  //3个选择语句,求出A尽可能多的赢的次数。
        a2=max(a2-a1,0);b2=max(b2-b1,0);c2=max(c2-c1,0); //让A剩余的尽量平,不能平的就是输的。
        xans=xans-a2-b2-c2;

        nans=nans+min(a3,c4);
        if(a3>c4)
        {
            a3=a3-c4;
            c4=0;
        }
        else
        {
            c4=c4-a3;
            a3=0;
        }
        nans=nans+min(b3,a4);
        if(b3>a4)
        {
            b3=b3-a4;a4=0;
        }
        else
        {
            a4=a4-b3;b3=0;
        }
        nans=nans+min(c3,b4);
        if(c3>b4)
        {
            c3=c3-b4;b4=0;
        }
        else
        {
            b4=b4-c3;c3=0;
        }
        a3=max(a3-a4,0);b3=max(b3-b4,0);c3=max(c3-c4,0);
        nans=nans-a3-b3-c3;   //同上半部分,只不过反过来了。
        nans=-nans;  //注意这里的取负数
        cout<<xans<<" "<<nans<<endl;
        }
    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值