题目描述
获得阎魔刀的PIPI终于得到了“抛瓦”,是时候向POPO决一死战复仇了。
已知PIPI初始为X点HP值,而POPO初始为Y点HP值,双方血条无上限。PIPI决定在n回合内解决POPO,每回合PIPI先行动,然后POPO向PIPI攻击。PIPI的行动模式有以下三种,每回合PIPI选择下面其中一种进行操作:
1.次元斩,此技能可以向POPO造成A点伤害。
2.治疗术,此技能可以使PIPI回复B点HP值。
3.皇家护卫,此技能可以使POPO这回合的攻击无效。
若PIPI能在n回合内解决POPO,第一行输出Win,第二行输出PIPI战胜POPO的最少回合数。若PIPI不能在n回合内解决POPO,输出Lose。
输入
第一行输入五个正整数,n,X,Y,A,B,其中n<=105,X,Y,A,B<=109。
接下来n个正整数ai(ai<=10^9),表示第i回合POPO攻击给PIPI造成的伤害。
输出
若PIPI能在n回合内解决POPO,第一行输出Win,第二行输出PIPI战胜POPO的最少回合数。若PIPI不能在n回合内解决POPO,输出Lose。
样例输入
4 3 3 1 1
1 10 1 10
样例输出
Win
4
思路:选择一个好的贪心策略,假设每次的pipi和popo的攻击都成立,直到第i回合时,pipi挂掉,取出优先队列中的popo的最大的伤害值,假设那个回合pipi没有攻击popo,选择了免疫伤害或者是加血中的最优方案
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
long long num[N];
int main(){
long long n,x,y,a,b;
int flag=0,k;
priority_queue<int> q;
scanf("%lld%lld%lld%lld%lld",&n,&x,&y,&a,&b);
for(int i=1;i<=n;i++){
if(flag) ///输入一定要完整
continue;
scanf("%lld",&num[i]);
q.push(num[i]); ///入大顶堆
y=y-a; ///pipi攻击popo
if(y<=0){
flag=1;
k=i;
continue;
}
x=x-num[i];///popo攻击pipi
if(x<=0){
int now=q.top();q.pop(); ///假设当时伤害最大的回合没有互相攻击
if(now<b){ ///恢复血量
x+=b;
}else
x+=now; ///免疫攻击
y+=a;
}
}
if(flag){
printf("Win\n%d",k);
}else{
printf("Lose\n");
}
}