原题
题目描述
非常喜欢玩酒馆战棋,他注意到很多情况在后期下只有鱼人才能击败鱼人。所以他想知道如果他和对手都使用鱼人流,他什么时候才能获胜。为了简化该问题,规定现在只有四种鱼人
9,带剧毒圣盾亡语;
9,带剧毒圣盾;
9,带剧毒亡语;
9,带剧毒。
注:
表示
攻击力和
血量
攻击效果
当一个
的随从攻击一个
的随从
假定两者都没有圣盾和剧毒
,则
变为
,
变为
。当任意一个随从的血量低于
,即视为死亡。
● 剧毒效果
当该随从攻击对方随从,对方被攻击随从立即死亡;
● 圣盾效果
免疫一次任何攻击效果;
● 亡语效果
随从死亡时触发,召唤一个藤蔓;
● 藤蔓
只有
,没有
。
请注意,如果一个有剧毒的随从攻击带有圣盾的随从,带有圣盾的随从不会死,但是它的圣盾会消失。
每回合一个随从都会攻击敌方随从,直至某一方随从数为
。只要
在游戏结束时仍有至少一个随从存活,
获胜
平局不算获胜
。 如果随从随机攻击,则很难预测游戏的结果。 但幸运的是,
的运气非常好,因此,无论可能性有多小,只要有可能获胜,他就可以赢得比赛。
现在他有
个
种鱼人,他的对手有
个
种鱼人。求该玩家能否获胜。若能,则输出“
”,否则输出“
”。
样例
输入
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
思路
我们可以先考虑一下最后
没有获胜的可能
- 如果只剩下了藤蔓。
-
- 如果 的藤蔓数量 他对手的藤蔓数量,则 没有获胜。
- 若果 的对手还剩下一些怪,则表示 没有把他的对手打败,所以他也没有获胜。
反之,
获胜。
我们再来考虑一下贪心的策略
- 每次 挨打。
-
- 如果 手里有藤蔓,那么可以用它来打掉对方的圣盾。因为输入的每一个数字都 ,所以藤蔓并打不死鱼人。
-
- 如果 手里有鱼人。
-
-
- 如果鱼人是有圣盾的,他就可以承受对面的攻击,转化成另一种鱼人。
-
-
-
- 如果鱼人是有亡语的,他就可以承受对面的攻击,转化成藤蔓。
-
-
-
- 如果鱼人什么都没有,他就直接死掉。
-
-
-
- 而且优先那有圣盾的人鱼来抗,保证死的人尽可能少。
-
- 每次攻击对方的操作都是一样的
-
- 优先打有亡语的。
-
- 再打什么都没有的
-
- 然后打有圣盾有亡语的
-
- 最后打有亡语的。
-
- 就是尽量打能一次打死的。
代码
#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");
}
}