题目大意

没玩过炉石的小白翻译:
现在有四种随从,这里的每种随从,如果对面没有免疫都是秒杀:

  • 带圣盾、亡语;
  • 带圣盾;
  • 带亡语;
  • 普通随从。

每种buff的效果:

  • 圣盾效果:免疫任何攻击,免疫一次后消失;
  • 亡语效果:随从死亡时召唤一个藤蔓;
  • 藤蔓:只有1攻击1血量的小怪。

每回合都要发动一次攻击,游戏结束时还有随从存活就算获胜(平局不算获胜)。
幸运的是,你掌握着你的对手(?),只要有一点可能获胜就可以赢。
现在你有a[i]个i种随从,他的对手有b[i​]个i种随从,你能否获胜?

解题思路

不要被原题的长长长长长描述劝退,因为我们操控着对手,可以让对面应付我们的最优策略,所以这道题很显然是贪心策略的问题。那么我们开始以上帝视角分析:

  • 藤蔓没法干掉任何随从(普通随从血量都是10^9),所以,藤蔓只能优先用来破圣盾;
    而反过来让对方下得一首烂棋,直接用对面的藤蔓打这边没有盾的随从白给即可。

  • 没有藤蔓后,直接用圣盾刚当然血亏。所以,我们让带亡语的先上,留下藤蔓破对面圣盾。

  • 以上都用完后,我们再最后上第一种满buff的随从,圣盾保护+制造藤蔓。

  • 藤蔓苟到最后也是一种方法,所以召唤的藤蔓要尽可能多。

AC代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10,M=1e9;
int T,a1,a2,a3,a4,a5,b1,b2,b3,b4,b5;
void fight()
{
    if(b3) b3--,b5++;
    else if(b4) b4--;
    else if(b1) b1--,b3++;
    else b2--,b4++;
}
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        a5=b5=0;
        scanf("%d%d%d%d%d%d%d%d",&a1,&a2,&a3,&a4,&b1,&b2,&b3,&b4);
        while(a1+a2+a3+a4 && b1+b2+b3+b4)
        {
            if(a3+a4) b5=0;
            if(a5 && b1+b2)
            {
                if(b1) b1--,b3++;
                else b2--,b4++;
                a5=0;
            }
            if(a3) a3--,a5++;
            else if(a1) a1--,a3++;
            else if(a2) a2--,a4++;
            else a4--;
            fight();
        }
        if(b1+b2+b3+b4 || !(a1+a2+a3+a4) && a5<=b5) puts("No");
        else puts("Yes");
    }
}