2020牛客暑期多校训练营(第十场)D-Hearthstone Battlegrounds 贪心模拟
Hearthstone Battlegrounds
题意
你和盆友玩一个游戏,有四种鱼人:
- 剧毒圣盾亡语
- 剧毒圣盾
- 剧毒亡语
- 剧毒
鱼人的血量都为\(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;
}