【NOIP2017提高A组集训10.21】Deep

题目描述

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 <= 105; 0 <= A, B <= 102
对于100% 的数据,有T <= 105; 0 <= A, B <= 105

思路

这题是用博弈论来做。首先,他们发现,如果对方耍赖皮,一直不用魔法,当自己成为先手后,虽然暂时深度会增加,但到自己魔法值用完后,对方也能相对应的加上他的魔法值。如果一忍到先手用完最后一个魔法值,后手可以趁机抄底,再加上自己的魔法值,也就是先手深度为魔法值-1,后手深度为魔法值+1。原先手也会考虑到这一点,导致了他变为后手后不会用魔法。
综上,如果魔法值都不为零,答案即为a-b-2。只要魔法值有一个为零,答案即为a-b。

Code

#include<cstdio>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
int t,a,b;
int main()
{
    
    
	fre(deep);
	scanf("%d",&t);
	for(int i=1;i<=t;i++)
	{
    
    
		scanf("%d%d",&a,&b);
		if(!a||!b) printf("%d\n",a-b);
		else printf("%d\n",a-b-2);
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_46830417/article/details/111753833