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

本文介绍了一个关于游戏博弈的策略问题,玩家Khadgar与燃烧军团通过使用法力水晶来增加传送门的法力等级,以此来决定最终的深度差。文章提供了一种算法解决方案,并附带了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 998244353
using 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');
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值