2020牛客暑期多校训练营(第十场) D-Hearthstone Battlegrounds
题意: 酒馆战棋共有四种怪,规定亡语会出一个(1/1)的白板植物(不是两个) :
- (1/ 10^9)的圣盾剧毒亡语
- (1/ 10^9)的圣盾剧毒
- (1/ 10^9)的剧毒亡语
- (1/ 10^9)的剧毒
现在给出双方4种怪的数量,总和不超过(5cdot 10^6)(当然不是7个)
我方一定打出完美团(对面一定全员内鬼),问是否能够取胜。
题解: 如果我们有植物,那么优先白嫖掉对面的盾。如果对面有植物,那么我们就用剧毒白吃掉对面的植物。由于不带亡语的剧毒怪死了之后场上就直接少了一个怪,所以我们的不带亡语剧毒怪统一留到最后进行处理。而植物能优先嫖掉对面的盾,所以我们要优先把亡语撞出来。所以我方的攻击策略优先级为1.剧毒亡语2.圣盾剧毒亡语3.圣盾剧毒4.剧毒。攻击对方的策略为1.剧毒亡语2.剧毒3.圣盾剧毒亡语4.圣盾剧毒。因为对面的盾一定是留在后面等我们把亡语生出来之后再被破的,而让对面的亡语早点生出来也可以让我们的不带盾的鱼人早点白嫖植物,拖一个轮次。然后一直模拟就完事了。最后如果两方鱼人都A完了,就比较一下谁的植物多就可以了。
Accept Code:
#include <bits/stdc++.h>
using namespace std;
int a,a0,a1,a2,a3,b,b0,b1,b2,b3,x,y;//3:圣盾剧毒亡语 2:圣盾剧毒 1:剧毒亡语 0:剧毒 a自己鱼人总和 b对面鱼人总和 x:我方植物 y:敌方植物
bool check(){
while(a&&b){
if(a0||a1) y=0;//我方不带盾鱼人白吃对面植物
while(x&&(b3||b2)){//我方植物白嫖对面圣盾
if(b3) b3--,b1++;
else b2--,b0++;
x--;
}
if(b1&&a-a0){//我方鱼人和对面剧毒亡语一换一
if(a1)a1--,a--,x++;//剧毒亡语换
else if(a3)a3--,a1++;//圣盾剧毒亡语换
else if(a2)a2--,a0++;//圣盾剧毒换
//else a0--,a--;//剧毒换
b1--,y++,b--;//对面亡语出植物
}else if(b0&&a-a0){//我方鱼人和对面剧毒一换一
if(a1)a1--,a--,x++; //剧毒亡语换
else if(a3)a3--,a1++;//圣盾剧毒亡语换
else if(a2)a2--,a0++;//圣盾剧毒换
//else a0--,a--;//剧毒换
b0--,b--;//直接死
}else if(b3&&a-a0){//我方怪破带亡语的盾
if(x)x--;//植物破盾
else if(a1)a1--,a--,x++;//剧毒亡语换
else if(a3)a3--,a1++;//圣盾剧毒亡语换
else if(a2)a2--,a0++;//圣盾剧毒换
//else a0--,a--;//剧毒换
b3--,b1++;//破盾
}else if(b2&&a-a0){//我方怪破盾
if(x)x--;//植物破盾
else if(a1)a1--,a--,x++;//剧毒亡语换
else if(a3)a3--,a1++;//圣盾剧毒亡语换
else if(a2)a2--,a0++;//圣盾剧毒换
//else a0--,a--;//剧毒换
b2--,b0++;//破盾
}else{//留下的剧毒和对面换
if(b1) b1--,b--,y++;//剧毒撞出亡语
else if(b0) b0--,b--;//一换一
else if(b3) b3--,b1++;//剧毒撞盾留亡语
else if(b2) b2--,b0++;//剧毒破盾
a0--,a--;//我方剧毒死
}
if(a0||a1) y=0;//白吃植物
}
if(a) return true;//我方还有怪
if(b) return false;//对面还有怪
return x>y;//植物一换一
}
int main(){
int t; cin>>t;
while(t--){
x=y=0;
cin>>a3>>a2>>a1>>a0>>b3>>b2>>b1>>b0;
a=a0+a1+a2+a3,b=b0+b1+b2+b3;
puts(check()?"Yes":"No");
}
}