题解0002:Best Cow Fences


题目描述:给定一个长度为n的正整数序列A。求一个平均数最大的,长度不小于L的子序列,输出这个平均数*1000。

题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1434

思路:用2分假定一个平均数,一步步缩小范围,最后求出这个平均数

代码(带注释):

#include
using namespace std;
double a[100001],b[100001],sum[100001],eps=1e-5,l=-1e6,r=1e6;//l和r数大点保险
int main(){
int N,L;
cin>>N>>L;
for(int i=1;i<=N;i++){
cin>>a[i];
}
while(r-l>eps){//二分
double mid=(l+r)/2;//假定平均值
for(int i=1;i<=N;i++){
b[i]=a[i]-mid;//所有数-去这个假定平均值,得到新数组

}
for(int i=1;i<=N;i++){
sum[i]=sum[i-1]+b[i];//压缩
}
double ans=-1e10;
double minn=1e10;
for(int i=L;i<=N;i++){
minn=min(minn,sum[i-L]);
ans=max(ans,sum[i]-minn);
}//遍历sum数组,求区间最大和
if(ans>=0){//判断假定平均值是大是小
l=mid;
}else{
r=mid;
}
}
cout< return 0;
}

相关