Best Cow Fences
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 13158 | Accepted: 4268 |
Description
Farmer John's farm consists of a long row of N (1 <= N <= 100,000)fields. Each field contains a certain number of cows, 1 <= ncows <= 2000.
FJ wants to build a fence around a contiguous group of these fields in order to maximize the average number of cows per field within that block. The block must contain at least F (1 <= F <= N) fields, where F given as input.
Calculate the fence placement that maximizes the average, given the constraint.
Input
* Line 1: Two space-separated integers, N and F.
* Lines 2..N+1: Each line contains a single integer, the number of cows in a field. Line 2 gives the number of cows in field 1,line 3 gives the number in field 2, and so on.
Output
* Line 1: A single integer that is 1000 times the maximal average.Do not perform rounding, just print the integer that is 1000*ncows/nfields.
Sample Input
10 6
6
4
2
10
3
8
5
9
4
1
Sample Output
6500
解析:
二分最大平均值,然后进行验证。如何验证?将序列中的元素减去平均值,如果有一段长度不小于的区间和大于等于
,说明这段区间对平均值有正的贡献,调整下边界,否则调整上边界。求长度不小于
的最大连续子段和需要一些小技巧,比如说判断以
为终点的连续子段和,就可以看
的正负。其中
表以
为终点的最大连续子段和。具体见代码。
PS:这道题卡精度很恶心。。。
代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cmath>
#include <stdio.h>
using namespace std;
const int Max=100010;
int n,m,ans;
double a[Max],f[Max],sum[Max],num[Max],l=1e9,r,mid,x=1e9;
inline int get_int()
{
int x=0,f=1;
char c;
for(c=getchar();(!isdigit(c))&&(c!='-');c=getchar());
if(c=='-') f=-1,c=getchar();
for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
return x*f;
}
inline bool check(double x)
{
for(int i=1;i<=n;i++) a[i]=num[i]-x,sum[i]=sum[i-1]+a[i],f[i]=max(f[i-1]+a[i],0.0);
for(int i=m;i<=n;i++) if(sum[i]-sum[i-m]+f[i-m]>=(-1e-6)) return 1;//这里应该是>=0但是因为精度问题,设成-1e-6才能过。。。
return 0;
}
int main()
{
n=get_int(),m=get_int();
for(int i=1;i<=n;i++)
{
num[i]=get_int();
l=min(l,num[i]),r=max(r,num[i]);
}
for(int i=1;i<=55;i++)
{
mid=(l+r)/2.0;
if(check(mid)) l=mid;
else r=mid;
}
l*=1000.0;
ans=l;
printf("%d",ans);
return 0;
}