2020暑期牛客多校训练营第九场(D)Hearthstone Battlegrounds(贪心,暴力)

Hearthstone Battlegrounds

原题请看这里

题目描述:

注意:本题中描述与真实战棋大不不同。
x t q xtq 非常喜欢玩酒馆战棋,他注意到很多情况在后期下只有鱼人才能击败鱼人。所以他想知道如果他和对手都使用鱼人流,他什么时候才能获胜。为了简化该问题,规定现在只有四种鱼人:

  1. 1 / 1 0 9 1/10^9 ,带剧毒圣盾亡语;
  2. 1 / 1 0 9 1/10^9 ,带剧毒圣盾;
  3. 1 / 1 0 9 1/10^9 ,带剧毒亡语;
  4. 1 / 1 0 9 1/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 2 y_1-x_2,y_2 变为 y 2 x 1 y_2-x_1 。当任意一个随从的血量低于1,即视为死亡。
● 剧毒效果:当该随从攻击对方随从,对方被攻击随从立即死亡;
● 圣盾效果:免疫一次任何攻击效果;
● 亡语效果:随从死亡时触发,召唤一个藤蔓;
● 藤蔓:只有 1 / 1 1/1 ,没有 b u f f buff
请注意,如果一个有剧毒的随从攻击带有圣盾的随从,带有圣盾的随从不会死,但是它的圣盾会消失。
每回合一个随从都会攻击敌方随从,直至某一方随从数为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 ”。

输入描述:

第一行包含一个整数 T ( 1 T 150000 ) T(1 \leq T \leq 150000) 表示测试用例的数量。
每个测试用例的第一行包含四个整数 a 1 a 2 a 3 a 4 ( 0 a i 100000 ) a_1,a_2,a_3,a_4(0 \leq a_i \leq 100000) ,它们表示 x t q xtq 最初拥有的各种鱼人的数量。
每个测试用例的第二行包含四个整数 b 1 b 2 b 3 b 4 ( 0 b i 100000 ) b_1,b_2,b_3,b_4(0 \leq b_i \leq 100000) ,它们表示 x t q xtq 的对手最初拥有的各种鱼人的数量。
所有测试用例的 a 1 + a 2 + a 3 + a 4 + b 1 + b 2 + b 3 + b 4 a_1 + a_2 + a_3 + a_4 + b_1 + b_2 + b_3 + b_4 的总和不超过 5 1 0 6 5 \cdot 10 ^ 6

输出描述:

打印T行-对于每个测试用例,如果 x t q xtq 可以胜出,则打印“ Y e s Yes ”,如果 x t q xtq 不能胜出,则打印“ 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

说明:

对于第一个测试用例,假设s1是xtq的第一类鱼人,s2是xtq的第三种鱼人,t1是敌人的第一种鱼人,t2是敌人的第三种鱼人。然后,xtq可以执行以下操作来赢得比赛:
-让s2攻击t2,然后它们都将被摧毁并召唤一个1/1藤蔓,分别称为s3和t3。
-让s3攻击t1,然后t1的神盾将消失,并且s3将被摧毁。
-让s1攻击t1,然后s1的神盾将消失,请注意t1现在没有神盾,因此它将死亡并召唤一个1/1植物,称其为t4。
-让s1攻击t3,然后t3将被销毁。
-让s1攻击t4,然后t4将被销毁。
完成这些操作后,s1仍然在棋盘上,但是xtq的敌人现在没有小兵了,因此xtq可以赢得比赛。
对于第二个测试用例,假设s1是xtq的第一类鱼人,s2是xtq的第四种鱼人,t1是敌人的第二种鱼人,t2是敌人的第三种鱼人。然后,xtq可以执行以下操作来赢得比赛:
-让s1攻击t1,那么它们的神盾将消失。
-让s1攻击t2,然后它们将死亡并召唤一个1/1藤蔓,分别称为s3和t3。
-让s2攻击t3,然后t3将被销毁。
-让s2攻击t1,然后它们都将被销毁。
完成这些操作后,s3仍在棋盘上,但xtq的敌人现在没有随从,因此xtq可以赢得比赛。
对于第三个测试用例,无论小兵如何进攻,xtq都无法赢得比赛。

思路:

贪心。
首先我们发现,这个藤蔓好蒻,攻击力和生命都只有一,而且其他的随从血量都为 1 e 9 1e9
然后我们发现,这个圣盾太 b u g bug 了,什么都挡得住!但是只有一次机会。
于是我们就想到:用藤蔓去打圣盾…这样稳赚
然后我们发现用剧毒去打圣盾血亏…
所以我们让带亡语的当炮灰,留下藤蔓来破圣盾
随后我们让 b u f f buff 满的随从向前冲,使用圣盾并制造藤蔓
由于藤蔓实在是太没用了,所以让藤蔓苟到最后…
反正我们可以操纵局势,只要有赢的可能就行,所以我们只要按照以上策略来写即可

A C AC C o d e Code :

这代码又臭又长…

#include<bits/stdc++.h>
using namespace std;
int T,a1,a2,a3,a4,a5,b1,b2,b3,b4,b5,flag;
int main(){
    scanf("%d",&T);
    while(T--){
        a5=b5=0;
        scanf("%d%d%d%d",&a1,&a2,&a3,&a4);
        scanf("%d%d%d%d",&b1,&b2,&b3,&b4);
        flag=0;
        while(1){
            if(a1+a2+a3+a4==0&&b1+b2+b3+b4==0){
                if(a5>b5){flag=1;break;}
                else break;
            }
            else if(a1+a2+a3+a4==0) break;
            else if(b1+b2+b3+b4==0){flag=1;break;}
            else{
                if(a3+a4) b5=0;
                if(a5&&(b1+b2)){
                    if(b1){a5--;b1--;b3++;}
                    else{a5--;b2--;b4++;}
                }
                else if(a3){
                    if(b1+b2){
                        if(b3){a3--;a5++;b3--;b5++;} 
                        else if (b4){a3--;a5++;b4--;} 
                        else if (b1){a3--;a5++;b1--;b3++;} 
                        else {a3--;a5++;b2--;b4++;} 
                    }
                    else{
                        if(b3){a3--;a5++;b3--;b5++;}
                        else if(b1){a3--;a5++;b1--;b3++;}
                        else if(b4){a3--;a5++;b4--;}
                        else{a3--;a5++;b2--;b4++;}
                    }
                }
                else if(a1){
                    if(b1+b2){
                        if(b3){a1--;a3++;b3--;b5++;}
                        else if(b4){a1--;a3++;b4--;}
                        else if(b1){a1--;a3++;b1--;b3++;}
                        else{a1--;a3++;b2--;b4++;}
                    }
                    else{
                        if (b3) a1--,a3++,b3--,b5++;
                        else if (b1) a1--,a3++,b1--,b3++;
                        else if (b4) a1--,a3++,b4--;
                        else a1--,a3++,b2--,b4++;
                    }
                }
                else if(a4){
                    if(b3){a4--;b3--;b5++;}
                    else if(b1){a4--;b1--;b3++;}
                    else if(b4){a4--;b4--;}
                    else{a4--;b2--;b4++;}
                }
                else{
                    if(b3){a2--;a4++;b3--;b5++;}
                    else if(b1){a2--;a4++;b1--;b3++;}
                    else if(b4){a2--;a4++;b4--;}
                    else{a2--;a4++;b2--;b4++;}
                }
            }
        }
        if(flag) printf("Yes\n");
        else printf("No\n");
    }
}

猜你喜欢

转载自blog.csdn.net/s260127ljy/article/details/107921003