题目
题解思路
很容易想到二分枚举出平均值
但是如何在 On内判断这个平均值在题目里的情况 大还是小
闫总用到了前缀和 先减去枚举的平均值
取mins为 1~k-f的最小值 不断往前更新的同时 ,根据每个K判断 此时的答案是大是小 。
有点动态规划的思想
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <map>
#include <string>
using namespace std;
const int INF = 0x3f3f3f3f;
int n , f ;
double a[100100];
double b[100100];
bool che( double avg )
{
b[0] = 0 ;
for (int i = 1 ;i <= n ; i++ )
b[i] = b[i-1] + a[i] - avg ;
double mis = INF ;
for (int i = f ; i <= n ; i++ )
{
mis = min( mis , b[i-f] );
if ( b[i] >= mis )
return 1;
}
return 0;
}
int main ()
{
ios::sync_with_stdio(false);
cin>>n>>f;
double t1 = 0 , t2 = 0;
for (int i = 1 ; i <= n ; i++ )
{
cin>>a[i];
t2 = max( a[i] , t2 );
}
while( t2 - t1 > 1e-5)
{
double mid = (t2 + t1)/2 ;
if ( che(mid) )
{
t1 = mid ;
}else
t2 = mid ;
}
cout<<(int)(t2*1000)<<"\n";
return 0 ;
}