懒散的奶牛(lazy)

懒散的奶牛(lazy)

【题目描述】
又是一个炎热的夏天,贝西感觉差不多要热疯了,它想找一段茂盛的草场避暑。牧场里面有N(1 <= N <= 100,000)个点有茂盛的草场其它的点没有牧草,所有点都在同一条坐标直线上,这N个点都有两个数据:分别表示这个点的牧草的茂盛程度g_i (1 <= g_i <= 10,000),和坐标x_i (0 <= x_i <= 1,000,000)。贝西想找到一个这样的点(不一定是有牧草的点)避暑:这个点的前后长度为K(1 <= K <= 2,000,000)的范围内茂盛程度之和最大,你能帮助它找到这个点吗?
输入格式:
第一行:两个整数N和K
第2..N+1行:每行两个整数g_i x_i ,分别代表第i个草场的茂盛程度和位置
输出格式:
一个整数代表找到长度为k的最大茂盛程度之和。
输入样例:
4 3
4 7
10 15
2 2
5 1


输出样例:
11
【样例解释】:最后贝西选择在位置x=4,这样它就把位置 x=1, x=2, x=7 三个草场包括进去了。 

从样例可以知到左右边界的取值范围:

l=4-3

r=4+3

已知情况:

1草场宽100万,在一直线上;

2坐标x,茂盛度g;

3k是坐标左右两边的宽度;

4要求某个点左右两边长度为k的茂盛程度。

算法:

1一定长度,可以尺取法吗?真正的长度是2*k+1,坐标从0开始算

2坐标和茂盛度可以尝试下标计数进行预处理,坐标为下标,茂盛程度为值;

3这样就可以通过尺取法来取某个长度最茂盛程度了;

4坑是少不了的:边界要处理好(1)坐标从0开始,这是第一个坑;(2)k为200万,实际长度为4000001,超过最大坐标,不考虑就越界丢分,这是第二个坑;(3)求的不是点,是这个点的茂盛程度;还有很多不起眼的坑…

#include<bits/stdc++.h>
using namespace std;
long long n,k,g,x,s[10000001],h,maxs=-1,ans,l,r;
int main()
{
    cin>>n>>k;
    for(int i=1; i<=n; i++)
    {
        scanf("%lld%lld",&g,&x);
        s[x]=g;
        //h+=g;
        if(x<maxs)maxs=x;
    }
    k=k*2+1;
    if(k>1000000)k=1000001;
    for(int i=0; i<=k-1; i++)ans+=s[i];
    if(ans>maxs)maxs=ans;
    for(int i=k; i<=1000000;i++)
    {
        r=i;
        ans+=s[r]-s[l];
        if(ans>maxs)maxs=ans;
        l++;
    }
    printf("%lld",maxs);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值