拔河

 
 
 
二分
思路:二分平均力量值,并在check中利用前缀和判断。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100005];
double sum[100005];
ll f,n;
bool check(double x)
{
    double d=x;
    double mn=0;
    for(int i=1;i<=n;i++)
    {
        sum[i]=sum[i-1]+(double)a[i]-d;
        if(i>=f)
        {
            mn=min(mn,sum[i-f]);
            if(sum[i]-mn>0) return 1;
        }
    }
    return 0;
}
int main()
{
    ll big=0;
    cin>>n>>f;
    for(int i=1;i<=n;i++) 
    {
        cin>>a[i];
        if(a[i]>big) big=a[i];
    }
    double l=1,r=(double)big;
    while(r-l>=1e-6)
    {
        double mid=(l+r)/2;
        if(check(mid)) l=mid;
        else r=mid;
    }
    cout<<(int)(r*1000)<<endl;
    return 0;
}



















