Hearthstone Battlegrounds
题目描述:
注意:本题中描述与真实战棋大不不同。
x
t
q
xtq
xtq非常喜欢玩酒馆战棋,他注意到很多情况在后期下只有鱼人才能击败鱼人。所以他想知道如果他和对手都使用鱼人流,他什么时候才能获胜。为了简化该问题,规定现在只有四种鱼人:
- 1 / 1 0 9 1/10^9 1/109,带剧毒圣盾亡语;
- 1 / 1 0 9 1/10^9 1/109,带剧毒圣盾;
- 1 / 1 0 9 1/10^9 1/109,带剧毒亡语;
- 1 / 1 0 9 1/10^9 1/109,带剧毒。
(注:
x
/
y
x/y
x/y表示
x
x
x攻击力和
y
y
y血量)
攻击效果:当一个
x
1
/
y
1
x_1/y_1
x1/y1的随从攻击一个
x
2
/
y
2
x_2/y_2
x2/y2的随从(假定两者都没有圣盾和剧毒),则
y
1
y_1
y1变为
y
1
−
x
2
,
y
2
y_1-x_2,y_2
y1−x2,y2变为
y
2
−
x
1
y_2-x_1
y2−x1。当任意一个随从的血量低于1,即视为死亡。
● 剧毒效果:当该随从攻击对方随从,对方被攻击随从立即死亡;
● 圣盾效果:免疫一次任何攻击效果;
● 亡语效果:随从死亡时触发,召唤一个藤蔓;
● 藤蔓:只有
1
/
1
1/1
1/1,没有
b
u
f
f
buff
buff。
请注意,如果一个有剧毒的随从攻击带有圣盾的随从,带有圣盾的随从不会死,但是它的圣盾会消失。
每回合一个随从都会攻击敌方随从,直至某一方随从数为0。只要
x
t
q
xtq
xtq在游戏结束时仍有至少一个随从存活,
x
t
q
xtq
xtq获胜(平局不算获胜)。 如果随从随机攻击,则很难预测游戏的结果。 但幸运的是,
x
t
q
xtq
xtq的运气非常好,因此,无论可能性有多小,只要有可能获胜,他就可以赢得比赛。
现在他有
a
i
a_i
ai 个
i
i
i 种鱼人,他的对手有
b
i
b_i
bi 个
i
i
i 种鱼人。求该玩家能否获胜。若能,则输出“
Y
e
s
Yes
Yes”,否则输出“
N
o
No
No”。
输入描述:
第一行包含一个整数
T
(
1
≤
T
≤
150000
)
T(1 \leq T \leq 150000)
T(1≤T≤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)
a1,a2,a3,a4(0≤ai≤100000),它们表示
x
t
q
xtq
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)
b1,b2,b3,b4(0≤bi≤100000),它们表示
x
t
q
xtq
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
a1+a2+a3+a4+b1+b2+b3+b4的总和不超过
5
⋅
1
0
6
5 \cdot 10 ^ 6
5⋅106
输出描述:
打印T行-对于每个测试用例,如果 x t q xtq xtq可以胜出,则打印“ Y e s Yes Yes”,如果 x t q xtq xtq不能胜出,则打印“ N o No 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
1e9…
然后我们发现,这个圣盾太
b
u
g
bug
bug了,什么都挡得住!但是只有一次机会。
于是我们就想到:用藤蔓去打圣盾…这样稳赚
然后我们发现用剧毒去打圣盾血亏…
所以我们让带亡语的当炮灰,留下藤蔓来破圣盾
随后我们让
b
u
f
f
buff
buff满的随从向前冲,使用圣盾并制造藤蔓
由于藤蔓实在是太没用了,所以让藤蔓苟到最后…
反正我们可以操纵局势,只要有赢的可能就行,所以我们只要按照以上策略来写即可
A C AC AC C o d e Code 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");
}
}