*(File IO): input:lazy_bronze.in output:lazy_bronze.out
時間限制: 1000 ms 空間限制: 128000 KB 具體限制 *
題目描述
夏天又到了,奶牛貝里斯開始變得非常懶惰。他想要站在一個地方,然後只走很少的一段路,就能喫到儘可能多的美味的青草。有塊草坪排列在一條直線上,第i個草坪擁有數量的青草,第個草坪所在的位置是。奶牛貝里斯想要在直線上選擇一個點作爲他的初始點(初始點有可能和草坪的位置重合),這樣他就能喫到以這個點爲中點距離不超過K的位置上的所有青草。如果初始點可以自由選擇的話,請幫助貝里斯計算他最多能喫到的青草的數量。
輸入
第一行是兩個正整數,表示N和K。
第行到第行,每行兩個整數,第行的兩個整數表示第i個草坪的和。
輸出
輸出貝里斯最多能喫到的青草數量。
樣例輸入
4 3
4 7
10 15
2 2
5 1
樣例輸出
11
數據範圍限制
。
提示
如果貝里斯將初始點選擇在的位置,那麼他可以喫到和這三個地方的青草,總共是。
解題思路
先做一個前綴和,然後從開始暴力枚舉初始點就好了。
代碼
#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);
}