1 条题解

  • 1
    @ 2026-8-18 16:03:22

    这波贪了……

    思路

    目测可知,怪兽11只会被在他右边的炸弹炸死,而且是最远的位置,因为如果在别的位置要么炸不到,要么炸到的别的怪兽的数量变少。就拿样例二举例,怪兽11只会被在位置55的炸弹炸死,因为这样一颗炸弹可以炸到所有怪兽。

    那当我们把第一个怪兽炸死了,第二个怪兽就成为了原本第一个怪兽,不断以此类推即可。

    对于一颗炸弹对于其他怪兽的影响,我们只需用upper_bound找到最远会炸到那个怪兽,用差分数组维护每个怪兽被之前的炸弹炸掉的血量即可。

    AC代码

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    const int N=2e5+10;
    struct node{int x,h;}a[N];
    bool operator<(node n1,node n2){return n1.x<n2.x;}
    int n,r,d,dd[N];
    signed main()
    {
    	scanf("%lld%lld%lld",&n,&r,&d);
    	for(int i=1;i<=n;i++)scanf("%lld%lld",&a[i].x,&a[i].h);
    	sort(a+1,a+n+1);
    	int cnt=0;
    	for(int i=1,dam=0;i<=n;i++)
    	{
    		dam+=dd[i];
    		a[i].h-=dam;
    		if(a[i].h>0)
    		{
    			int id=upper_bound(a+1,a+n+1,node{a[i].x+r*2,0})-a;
    			dam+=(a[i].h+d-1)/d*d;
    			dd[id]-=(a[i].h+d-1)/d*d;
    			cnt+=(a[i].h+d-1)/d;
    		}
    	}
    	printf("%lld\n",cnt);
    	return 0;
    }
    
    • 1

    信息

    ID
    11818
    时间
    2000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    5
    已通过
    2
    上传者