这题使用前缀和即可求解,毕竟是求某个数组的某个固定范围内和的最大值,但值得注意的是,某个位置可能会有多个星星叠加,所以亮度也是要累计的,且这里的长度1应该是指1这个位置所占的长度,比如窗的宽度是3,即可包含1,2,3三个数字,而不是算它们的间隔。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,w,x,b;
int a[100005]={0},aa[100005]={0},maxo=0,max1=0;
//a是每个位置的亮度,aa是a的前缀和数组,maxo是星星位置的最远处,max1是求解的范围内最大亮度
cin>>n>>w;
for(int i=1;i<=n;i++)
{
cin>>x>>b;
a[x]+=b; //注意星星亮度叠加
maxo=maxo>x?maxo:x;
}
for(int i=1;i<=maxo;i++) //求前缀和
{
aa[i]=aa[i-1]+a[i];
}
for(int i=1;i<=maxo;i++) //找范围内的最大亮度
{
max1=max1>(aa[i+w-1]-aa[i-1])?max1:(aa[i+w-1]-aa[i-1]);
}
cout<<max1<<endl;
return 0;
}