题解
什么时候会输?
首先我们要贪心一次性把离自己最近的怪物消灭掉,但是一回合内消灭掉了一个怪物之后还有剩余,我么就把剩余的扣在第二个离自己最近的怪物上
如果我当前回合没有消灭怪物,并且怪物下一回合就到零点,那我就输了
我们可以想象成这样的动画:我们每回合一次性往怪物身上丢出所有的手雷,手雷依次爆炸,直到怪物被炸死,剩余的手雷会返回
所以我们有两个从1开始的线性变量,一个是回合数,一个是怪物下标
然而回合数不确定,所以不能以回合数作为循环主体,然后一个回合可能可以砍掉多个怪兽,也有可能多个回合砍掉一个怪兽,所以我们不能用for循环
然后观察样例发现,进攻时是回合开始时,怪兽移动实在回合结束时,所以判断怪兽在当前回合会不会到零点要在进攻之后判断
当当前怪兽没死,且回合数大于x时,失败
code
#include<bits/stdc++.h>
using namespace std;
struct unit
{
int a,x;
}mon[300005];
bool cmp(unit a,unit b)
{
return abs(a.x)<abs(b.x);
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>mon[i].a;
for(int i=1;i<=n;i++) cin>>mon[i].x;
sort(mon+1,mon+1+n,cmp);
int r=1,i=1,en=k;
while(i<=n)
{
mon[i].a-=en;
if(mon[i].a<=0)
{
en=-mon[i].a;
i++;
}
else
{
if(abs(mon[i].x)<=r) break;
r++;
en=k;
}
}
if(i==n+1) puts("YES");
else puts("NO");
}
return 0;
}
标签:怪兽,int,回合,Attack,mon,Monsters,unit,怪物
From: https://www.cnblogs.com/pure4knowledge/p/18041040