BNUOJ 34968 石头剪子布

来源:互联网 发布:我的淘宝网卖家中心 编辑:程序博客网 时间:2024/05/02 16:25
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

21 1 1 1 1 13 0 0 0 3 0

Sample Output

3 -33 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 1000000007using namespace std;//a>b>cint 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 0
原创粉丝点击