(紀中)1929. 懶惰的奶牛[b](lazy_bronze)

*(File IO): input:lazy_bronze.in output:lazy_bronze.out
時間限制: 1000 ms 空間限制: 128000 KB 具體限制 *


題目描述
夏天又到了,奶牛貝里斯開始變得非常懶惰。他想要站在一個地方,然後只走很少的一段路,就能喫到儘可能多的美味的青草。有NN塊草坪排列在一條直線上,第i個草坪擁有gig_i數量的青草,第ii個草坪所在的位置是xix_i。奶牛貝里斯想要在直線上選擇一個點作爲他的初始點(初始點有可能和草坪的位置重合),這樣他就能喫到以這個點爲中點距離不超過K的位置上的所有青草。如果初始點可以自由選擇的話,請幫助貝里斯計算他最多能喫到的青草的數量。


輸入
第一行是兩個正整數,表示N和K。
22行到第N+1N+1行,每行兩個整數,第ii行的兩個整數表示第i個草坪的gig_ixix_i

輸出
輸出貝里斯最多能喫到的青草數量。


樣例輸入
4 3
4 7
10 15
2 2
5 1

樣例輸出
11


數據範圍限制
1<=N<=100000,1<=gi<=10000,0<=xi<=1000000,1<=k<=20000001<=N<=100000,1<=g_i<=10000,0<=x_i<=1000000,1<=k<=2000000


提示
如果貝里斯將初始點選擇在x=4x=4的位置,那麼他可以喫到x=1x=2x=1,x=2x=7x=7這三個地方的青草,總共是1111


解題思路
先做一個前綴和,然後從kk開始暴力枚舉初始點就好了。


代碼

#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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章