懒散的奶牛(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;
}