B e s t C o w F e n c e s Best Cow Fences Best Cow Fences
题目链接:POJ 2018
题目大意
给你
n
n
n个田地的牛数,让你找出连续的且数量大于等于
F
F
F的一段区间,使这段区间内的每个田地的平均牛数最大。
输出最大的平均牛数
∗
1000
*1000
∗1000的值。
样例输入
10 6
6
4
2
10
3
8
5
9
4
1
样例输出
6500
数据范围
1
<
=
N
<
=
100
,
000
1 <= N <= 100,000
1<=N<=100,000
1
<
=
每
个
田
地
的
牛
数
<
=
2000
1<=每个田地的牛数<=2000
1<=每个田地的牛数<=2000
1
<
=
F
<
=
N
1 <= F <= N
1<=F<=N
思路
这道题就是一道二分。
枚举平均值,用平均值减每一个数,看区间最大值是否为非负数。是则可以,在右边;否则在不可以,在左边。
最后输出
r
r
r即可。
代码
#include<cstdio>
#define max(x,y) (x)>(y)?(x):(y)
#define min(x,y) (x)<(y)?(x):(y)
using namespace std;
int n,f;
double a[100001],l,r,qzh[100001],b[100001],an,ans;
int main()
{
scanf("%d%d",&n,&f);//读入
for (int i=1;i<=n;i++)
scanf("%lf",&a[i]);//读入
l=-1e6;r=1e6;//初始化
while (r-l>1e-5)//二分
{
double mid=(l+r)/2;
for (int i=1;i<=n;i++)
b[i]=a[i]-mid;//减平均值
for (int i=1;i<=n;i++)
qzh[i]=qzh[i-1]+b[i];//算前缀和
ans=-1e10;an=1e10;//初始化
for (int i=f;i<=n;i++)
{
an=min(an,qzh[i-f]);
ans=max(ans,qzh[i]-an);//算出区间最大值
}
if (ans>=0) l=mid;//在右边(可以)
else r=mid;//在左边(不可以)
}
printf("%d",(int)(r*1000));//输出
return 0;
}