2020牛客暑期多校训练营(第十场)D-Hearthstone Battlegrounds 贪心模拟

Hearthstone Battlegrounds

题意

你和盆友玩一个游戏,有四种鱼人:

  1. 剧毒圣盾亡语
  2. 剧毒圣盾
  3. 剧毒亡语
  4. 剧毒

鱼人的血量都为(10^9),攻击力都为(1)

藤曼的血量和攻击力均为(1)

带有剧毒的鱼人的攻击可以秒杀敌人,圣盾可以抵挡一次攻击,带有亡语的鱼人死后可以召唤出一个藤曼。每回合你可以选择一个随从和对方的一个随从战斗,攻击是双向的,即双方的随从都会受到对方随从的攻击。

分析

贪心的想法就是尽量用藤曼去消耗敌方带圣盾的鱼人,具体为:

  • 若敌方有藤曼,优先用鱼人攻击藤曼,其次用藤曼
  • 若敌方有带圣盾的鱼人
    • 若我方有藤曼,用藤曼去攻击(1、2)(顺序表示优先级)号鱼人,否则用(3、1)号鱼人去攻击对方的(3、4、1、2)号鱼人
  • 若敌方没有带圣盾的鱼人,那么只要优先使用鱼人来攻击对方的随从,其次用藤曼即可。

Code

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int T;
int a[5],b[5];
int ck(){
    int flag=1;
    for(int i=0;i<5;i++) if(a[i]!=0) flag=0;
    if(flag) return 0;
    flag=1;
    for(int i=0;i<5;i++) if(b[i]!=0) flag=0;
    if(flag) return 1;
    return 2;
}
void attack(int u,int x){
    if(u==0){
        if(x==0||x==1){
            --a[x];
            ++a[x+2];
        }else if(x==2){
            --a[x];
            ++a[4];
        }else --a[x];
    }else{
        if(x==0||x==1){
            --b[x];
            ++b[x+2];
        }else if(x==2){
            --b[x];
            ++b[4];
        }else --b[x];
    }
}
void solve(){
    if(b[2]) attack(1,2);
    else if(b[3]) attack(1,3);
    else if(b[0]) attack(1,0);
    else if(b[1]) attack(1,1);    
}
int main(){
    scanf("%d",&T);
    while(T--){
        a[4]=b[4]=0;
        for(int i=0;i<4;i++){
            scanf("%d",&a[i]);
        }
        for(int i=0;i<4;i++){
            scanf("%d",&b[i]);
        }
        while(ck()==2){
            int flag=0;
            for(int i=0;i<4;i++) if(a[i]) flag=1;
            if(flag&&b[4]){
                attack(1,4);
                continue;
            }
            if(a[4]&&(b[0]||b[1])){
                attack(0,4);
                if(b[0]) attack(1,0);
                else if(b[1]) attack(1,1);
            }else if(a[2]){
                attack(0,2);
                solve();
            }else if(a[0]){
                attack(0,0);
                solve();
            }else if(a[1]){
                attack(0,1);
                solve();
            }else if(a[3]){
                attack(0,3);
                solve();
            }else{
                --a[4];
                if(b[4]) --b[4];
            };
        }
        if(ck()==0){
            puts("No");
        }else puts("Yes");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/xyq0220/p/13804565.html