5407. Deep

Fly_with_dream發表於2020-12-26

感覺這題的難度是無法估計的,運氣有時候也很重要……


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


首先,看到這道題,你的第一反應是什麼?
我的是貪心。
所以開始往貪心方面想,結果發現我對題目的理解還不夠深。所以先是放下這道題,開始弄第三題的暴力去了。當我再看到這道題,時間已經過去2小時了,這時我樣例A了T2&T3。
所以看到T4,嘆了口氣,感覺還是暴力。所以開始著手第一題。
分析了一下,你會發現某種情況下,先手的總是會被翻盤。那是什麼情況呢?

可以知道,後手總是存在一種可以讓先手輸的方法。先“誘惑”先手弄出一顆水晶,那麼後手就會等到先手把水晶用完。這時後手在用。
只要後手堅持這樣的方法,那麼他就會贏。

所以我們要考慮的情況只有兩種了:

  1. 先手或者後手中有一個是0,那麼直接輸出他們的差
  2. 要不然,只能輸出他們的差-2(我比賽的時候沒去證明,只是看著樣例弄出來的

所以最終的CPP:

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

相關文章