poj2018 Best Cow Fences

Best Cow Fences
Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 15533   Accepted: 4995

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

Source

解析:二分法

求每一项与均值的差,如果差之和大于等于0,这说明均值满足条件,找到最大的满足条件的均值即可。

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=100010;
int n,f;
double a[maxn],b[maxn],sum[maxn],maxx[maxn];
int check(double mid){
    for(int i=1;i<=n;i++){
        sum[i]=sum[i-1]+a[i]-mid;
    }
    double mintemp=0x3f3f3f3f;
    for(int j=f;j<=n;j++){
        mintemp=min(mintemp,sum[j-f]);//1~j-f最小的那个和
        if(sum[j]-mintemp>=0)return true;
    }
    return false;
}
int main(){
    cin>>n>>f;
    for(int i=1;i<=n;i++) cin>>a[i];
    double l=0,r=2000,mid;
    for(int i=1;i<=40;i++){
        mid=(l+r)/2;
        if(check(mid))l=mid;
        else r=mid;
    }
    cout << int(r * 1000);//如果把r该位l会WR 
//    printf("%.0lf",r*1000);//四舍五入,而牛只能向下取整 
    return 0;
    
}
原文地址:https://www.cnblogs.com/ssfzmfy/p/10987267.html