AcWing 101. 最高的牛
原题链接
简单
作者:
ldj1231
,
2021-07-24 20:01:05
,
所有人可见
,
阅读 178
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010;
int n,f;
int cows[N];//记录每个田的牛数
double sum[N];//记录前缀和
bool check(double avg)
{
for(int i = 1; i <= n ; i ++) sum[i] = sum[i-1] + cows[i] - avg;//把cows中每个数都减去mid,这时加起来大于等于0的序列的原序列平均数一定大于等于mid
double miv = 0 ;//保持完整序列时是-0,所以初始化为0
for(int i = f , j = 0; i <= n; i ++ , j ++)//i和j同时循环,保证i - j >= f, 直到 i = n
{
miv = min(miv , sum[j]);//从i - f前的序列中选出最小的
if(sum[i] - miv >= 0) return true;//如果前i个之和减去前j个之和大于等于0,则代表这[i,j]个数的平均数大于等于mid
}
return false;//没有满足情况的序列
}
main()
{
cin >> n >> f;
for(int i = 1; i <= n; i ++) cin >> cows[i];//输入
double l = 0, r = 2000;//因为每个田最多2000头牛,所以平均数不可能大于2000
while(r - l > 1e-5)//保证精度在10的5次方
{
double mid = (l + r) / 2;//因为是浮点数除法,不能用右移向下取整
if(check(mid)) l = mid;//最大值大于等于mid,此时答案区间缩小位[mid,r]
else r = mid;//最大值小于等于mid,此时答案区间缩小位[l,mid]
}
cout<<(int)(r * 1000)<<endl;
return 0;
}