B. Monsters Attack!

原题链接

题解

什么时候会输?
首先我们要贪心一次性把离自己最近的怪物消灭掉,但是一回合内消灭掉了一个怪物之后还有剩余,我么就把剩余的扣在第二个离自己最近的怪物上
如果我当前回合没有消灭怪物,并且怪物下一回合就到零点,那我就输了
我们可以想象成这样的动画:我们每回合一次性往怪物身上丢出所有的手雷,手雷依次爆炸,直到怪物被炸死,剩余的手雷会返回
所以我们有两个从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;
}

posted @   纯粹的  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示