(纪中)1929. 懒惰的奶牛[b](lazy_bronze)

*(File IO): input:lazy_bronze.in output:lazy_bronze.out
时间限制: 1000 ms 空间限制: 128000 KB 具体限制 *


题目描述
夏天又到了,奶牛贝里斯开始变得非常懒惰。他想要站在一个地方,然后只走很少的一段路,就能吃到尽可能多的美味的青草。有 N N N块草坪排列在一条直线上,第i个草坪拥有 g i g_i gi数量的青草,第 i i i个草坪所在的位置是 x i x_i xi。奶牛贝里斯想要在直线上选择一个点作为他的初始点(初始点有可能和草坪的位置重合),这样他就能吃到以这个点为中点距离不超过K的位置上的所有青草。如果初始点可以自由选择的话,请帮助贝里斯计算他最多能吃到的青草的数量。


输入
第一行是两个正整数,表示N和K。
2 2 2行到第 N + 1 N+1 N+1行,每行两个整数,第 i i i行的两个整数表示第i个草坪的 g i g_i gi x i x_i xi

输出
输出贝里斯最多能吃到的青草数量。


样例输入
4 3
4 7
10 15
2 2
5 1

样例输出
11


数据范围限制
1 < = N < = 100000 , 1 < = g i < = 10000 , 0 < = x i < = 1000000 , 1 < = k < = 2000000 1<=N<=100000,1<=g_i<=10000,0<=x_i<=1000000,1<=k<=2000000 1<=N<=100000,1<=gi<=10000,0<=xi<=1000000,1<=k<=2000000


提示
如果贝里斯将初始点选择在 x = 4 x=4 x=4的位置,那么他可以吃到 x = 1 , x = 2 x=1,x=2 x=1x=2 x = 7 x=7 x=7这三个地方的青草,总共是 11 11 11


解题思路
先做一个前缀和,然后从 k k k开始暴力枚举初始点就好了。


代码

#include<bits/stdc++.h>
using namespace std;
long long n,k,bsy[4001000],g,x,maxn,ans;
int main(){
	freopen("lazy_bronze.in","r",stdin);
	freopen("lazy_bronze.out","w",stdout);
	scanf("%lld%lld",&n,&k);
	k=2*k+1;
	for(long long i=1;i<=n;i++)
	{
		scanf("%lld%lld",&g,&x);
		bsy[x+1]=g;
		maxn=max(maxn,x+1);
	}
	if(k>=maxn) maxn=k;
	for(long long i=1;i<=maxn;i++)
		bsy[i]+=bsy[i-1];
	for(long long i=k;i<=maxn;i++)
	{
		if(bsy[i]-bsy[i-k]>ans)
		ans=bsy[i]-bsy[i-k];
	}
	printf("%lld",ans);
}

你可能感兴趣的:(纪中)