原题
题目描述
x
t
q
xtq
xtq非常喜欢玩酒馆战棋,他注意到很多情况在后期下只有鱼人才能击败鱼人。所以他想知道如果他和对手都使用鱼人流,他什么时候才能获胜。为了简化该问题,规定现在只有四种鱼人
:
:
:
1.
1.
1.
1
/
1/
1/
10
10
109,带剧毒圣盾亡语;
2.
2.
2.
1
/
1/
1/
10
10
109,带剧毒圣盾;
3.
3.
3.
1
/
1/
1/
10
10
109,带剧毒亡语;
4.
4.
4.
1
/
1/
1/
10
10
109,带剧毒。
(
(
(注:
x
/
y
x/y
x/y表示
x
x
x攻击力和
y
y
y血量
)
)
)
攻击效果
:
:
:当一个
x
1
/
y
1
x_1/y_1
x1/y1的随从攻击一个
x
2
/
y
2
x_2/y_2
x2/y2的随从
(
(
(假定两者都没有圣盾和剧毒
)
)
),则
y
1
y_1
y1变为
y
1
−
x
2
y_1-x_2
y1−x2,
y
2
y_2
y2变为
y
2
−
x
1
y_2-x_1
y2−x1。当任意一个随从的血量低于
1
1
1,即视为死亡。
● 剧毒效果
:
:
:当该随从攻击对方随从,对方被攻击随从立即死亡;
● 圣盾效果
:
:
:免疫一次任何攻击效果;
● 亡语效果
:
:
:随从死亡时触发,召唤一个藤蔓;
● 藤蔓
:
:
:只有
1
/
1
1/1
1/1,没有
b
u
f
f
buff
buff。
请注意,如果一个有剧毒的随从攻击带有圣盾的随从,带有圣盾的随从不会死,但是它的圣盾会消失。
每回合一个随从都会攻击敌方随从,直至某一方随从数为
0
0
0。只要
x
t
q
xtq
xtq在游戏结束时仍有至少一个随从存活,
x
t
q
xtq
xtq获胜
(
(
(平局不算获胜
)
)
)。 如果随从随机攻击,则很难预测游戏的结果。 但幸运的是,
x
t
q
xtq
xtq的运气非常好,因此,无论可能性有多小,只要有可能获胜,他就可以赢得比赛。
现在他有
a
i
a_i
ai个
i
i
i种鱼人,他的对手有
b
i
b_i
bi个
i
i
i种鱼人。求该玩家能否获胜。若能,则输出“
Y
e
s
Yes
Yes”,否则输出“
N
o
No
No”。
样例
输入
3
1 0 1 0
1 0 1 0
1 0 0 1
0 1 1 0
1 0 0 1
1 0 1 0
输出
Yes
Yes
No
思路
我们可以先考虑一下最后
x
t
q
xtq
xtq没有获胜的可能
:
:
:
- 如果只剩下了藤蔓。
-
- 如果 x t q xtq xtq的藤蔓数量 ≤ ≤ ≤他对手的藤蔓数量,则 x t q xtq xtq没有获胜。
- 若果 x t q xtq xtq的对手还剩下一些怪,则表示 x t q xtq xtq没有把他的对手打败,所以他也没有获胜。
反之,
x
t
q
xtq
xtq获胜。
我们再来考虑一下贪心的策略
:
:
:
- 每次 x t q xtq xtq挨打。
-
- 如果 x t q xtq xtq手里有藤蔓,那么可以用它来打掉对方的圣盾。因为输入的每一个数字都 ≤ 100000 ≤100000 ≤100000,所以藤蔓并打不死鱼人。
-
- 如果 x t q xtq xtq手里有鱼人。
-
-
- 如果鱼人是有圣盾的,他就可以承受对面的攻击,转化成另一种鱼人。
-
-
-
- 如果鱼人是有亡语的,他就可以承受对面的攻击,转化成藤蔓。
-
-
-
- 如果鱼人什么都没有,他就直接死掉。
-
-
-
- 而且优先那有圣盾的人鱼来抗,保证死的人尽可能少。
-
- 每次攻击对方的操作都是一样的
-
- 优先打有亡语的。
-
- 再打什么都没有的
-
- 然后打有圣盾有亡语的
-
- 最后打有亡语的。
-
- 就是尽量打能一次打死的。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int t,a[5],b[5];
void slove()
{
if(b[2])b[2]--,b[4]++;
else if(b[3])b[3]--;
else if(b[0])b[0]--,b[2]++;
else b[3]++,b[1]--;
}
int main()
{
for(scanf("%d",&t);t--;a[4]=b[4]=0)
{
scanf("%d%d%d%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&b[0],&b[1],&b[2],&b[3]);
while(a[0]+a[1]+a[2]+a[3]&&b[0]+b[1]+b[2]+b[3])
{
if(a[2]+a[3])b[4]=0;
if(a[4]&&b[0]+b[1])
{
if(b[0])b[2]++,b[0]--;
else b[3]++,b[1]--;
a[4]--;
}
if(a[2])a[2]--,a[4]++,slove();
else if(a[0])a[0]--,a[2]++,slove();
else if(a[1])a[1]--,a[3]++,slove();
else a[3]--,slove();
}
if(b[0]+b[1]+b[2]+b[3])puts("No");
else if(!(a[0]+a[1]+a[2]+a[3])&&a[4]<=b[4])puts("No");
else puts("Yes");
}
}