JZOJ5407. 【NOIP2017提高A组集训10.21】Deep

来源:互联网 发布:js 错误的数量词 编辑:程序博客网 时间:2024/06/07 05:45

Description

失败的燃烧军团想要逃回深渊,Khadgar 想要追击它们。
然而进入深渊的传送门只有一座,燃烧军团和Khadgar 各有一些法力水晶,由Khadgar 先手,双方每次可以作出如下选择:
• 使用一个法力水晶,使得传送门的法力等级增加一。
• 不用法力水晶,让对方增加等于传送门法力等级的深度,然后将传送门的法力值清零。特别地,若法力水晶数不为零且传送门法力等级为零则不能进行这样的操作。
双方都会采取最优策略使自己的最终深度与对手深度的差最大(初始时深度均为零)。
现在多次给定双方起始的法力水晶数量A, B,求Khadgar 与燃烧军团的的最终深度差。

Input

T
A1 B1
A2 B2

AT BT

Output

输出T 行T 个整数,表示Khadgar 与燃烧军团的的深度差。

Sample Input

2
0 1
4 1

Sample Output

-1
1

Data Constraint

对于30% 的数据,有T= 1; 0 <= A, B <= 10
对于另外20% 的数据,有T <= 10^5; 0 <= A, B <= 10^2
对于100% 的数据,有T <= 10^5; 0 <= A, B <= 10^5

题解

对于每一个自己拥有的法力水晶,最多可以给自己增加一点深度。
当对方的法力水晶为0的时候,自己手上的所有法力水晶都可以给自己增加深度。

所有,对于每一个a>b的情况,都可以转变为a=b,
然后多出来的都变为自己的深度。

无论什么时候,先手都是不利的,后手总会选择不用法力水晶,可以知道当a=b的时候,深度差值为2。

code

#include<queue>#include<cstdio>#include<iostream>#include<algorithm>#include <cstring>#include <string.h>#include <cmath>#include <math.h>#define ll long long#define N 5003#define db double#define P putchar#define G getchar#define mo 998244353using namespace std;char ch;void read(int &n){    n=0;    ch=G();    while((ch<'0' || ch>'9') && ch!='-')ch=G();    ll w=1;    if(ch=='-')w=-1,ch=G();    while('0'<=ch && ch<='9')n=(n<<3)+(n<<1)+ch-'0',ch=G();    n*=w;}int max(int a,int b){return a>b?a:b;}int min(int a,int b){return a<b?a:b;}ll abs(ll x){return x<0?-x:x;}ll sqr(ll x){return x*x;}void write(ll x){if(x>9) write(x/10);P(x%10+'0');}int ans,a,b,T;int dg(int a,int b,int door,int s,bool bz){    if(a==0 && b==0 && door==0)return s;    if(bz)//max -->A    {        int mx=-2147483647;        if(door!=0 || a==0)mx=max(mx,dg(a,b,0,s-door,0));        if(a>0)mx=max(mx,dg(a-1,b,door+1,s,0));        return mx;    }    else //min -->B    {        int mi=2147483647;        if(door!=0 || b==0)mi=min(mi,dg(a,b,0,s+door,1));        if(b>0)mi=min(mi,dg(a,b-1,door+1,s,1));        return mi;    }}int main(){    freopen("deep.in","r",stdin);    freopen("deep.out","w",stdout);    read(T);    while(T--)    {        read(a);read(b);        ans=a==0 || b==0?a-b:a-b-2;        if(ans<0)P('-'),write(-ans);else write(ans);        P('\n');    }}
阅读全文
0 0