poj2018 Best Cow Fences

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

Descriptionios

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.

Inputui

* 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.

Outputspa

* 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 Inputcode

10 6
6 
4
2
10
3
8
5
9
4
1

Sample Outputorm

6500

Sourceblog

 

解析:二分法ip

求每一項與均值的差,若是差之和大於等於0,這說明均值知足條件,找到最大的知足條件的均值便可。ci

 

 

#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;
    
}
相關文章
相關標籤/搜索