拔河
二分
思路:二分平均力量值,并在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;
}