2020牛客暑期多校训练营(第十场) Hearthstone Battlegrounds

原题
题目描述
x t q xtq 非常喜欢玩酒馆战棋,他注意到很多情况在后期下只有鱼人才能击败鱼人。所以他想知道如果他和对手都使用鱼人流,他什么时候才能获胜。为了简化该问题,规定现在只有四种鱼人
1. 1. 1 / 1/ 10 10 9,带剧毒圣盾亡语;
2. 2. 1 / 1/ 10 10 9,带剧毒圣盾;
3. 3. 1 / 1/ 10 10 9,带剧毒亡语;
4. 4. 1 / 1/ 10 10 9,带剧毒。
注: x / y x/y 表示 x x 攻击力和 y y 血量
攻击效果 当一个 x 1 / y 1 x_1/y_1 的随从攻击一个 x 2 / y 2 x_2/y_2 的随从 假定两者都没有圣盾和剧毒 ,则 y 1 y_1 变为 y 1 x 2 y_1-x_2 y 2 y_2 变为 y 2 x 1 y_2-x_1 。当任意一个随从的血量低于 1 1 ,即视为死亡。
● 剧毒效果 当该随从攻击对方随从,对方被攻击随从立即死亡;
● 圣盾效果 免疫一次任何攻击效果;
● 亡语效果 随从死亡时触发,召唤一个藤蔓;
● 藤蔓 只有 1 / 1 1/1 ,没有 b u f f buff
请注意,如果一个有剧毒的随从攻击带有圣盾的随从,带有圣盾的随从不会死,但是它的圣盾会消失。
每回合一个随从都会攻击敌方随从,直至某一方随从数为 0 0 。只要 x t q xtq 在游戏结束时仍有至少一个随从存活, x t q xtq 获胜 平局不算获胜 。 如果随从随机攻击,则很难预测游戏的结果。 但幸运的是, x t q xtq 的运气非常好,因此,无论可能性有多小,只要有可能获胜,他就可以赢得比赛。
现在他有 a i a_i i i 种鱼人,他的对手有 b i b_i i i 种鱼人。求该玩家能否获胜。若能,则输出“ Y e s Yes ”,否则输出“ N o 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 没有获胜的可能

  • 如果只剩下了藤蔓。
    • 如果 x t q xtq 的藤蔓数量 他对手的藤蔓数量,则 x t q xtq 没有获胜。
  • 若果 x t q xtq 的对手还剩下一些怪,则表示 x t q xtq 没有把他的对手打败,所以他也没有获胜。

反之, x t q xtq 获胜。
我们再来考虑一下贪心的策略

  • 每次 x t q xtq 挨打。
    • 如果 x t q xtq 手里有藤蔓,那么可以用它来打掉对方的圣盾。因为输入的每一个数字都 100000 ≤100000 ,所以藤蔓并打不死鱼人。
    • 如果 x t q 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");
    }
}

猜你喜欢

转载自blog.csdn.net/bbbll123/article/details/107921115