标签:return 方法 条件 namespace 之间 ret font 转化 ace
牛的数量<=1e5,字段长度在1和1e5之间,所以如果枚举所有字段的话最坏情况会超,所以这里我们考虑其他方法,因为同一个圈子里牛的最大数量是2000,所以最多有1e5*2000=2e8,又显然答案是有单调性的,二分的话复杂度在log(2e8)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
bool bok[1000];
const int maxn=1e5+90;
double a[maxn],b[maxn],sum[maxn];int main(){
ios::sync_with_stdio(false); int n,f;
cin>>n>>f;
double l=-1e6,r=1e6,eps=1e-5;
for(int i=1;i<=n;i++) {
cin >> a[i];
}
while (r-l>eps){//最后输出*1000整数所以只要保证0.001位准确,这里精确到0.000001
double mid=(l+r)/2.0;
for(int i=1;i<=n;i++)b[i]=a[i]-mid;(将二分转化为判定条件)
for(int i=1;i<=n;i++)sum[i]=b[i]+sum[i-1];(如果sum<0则小于平均值,否则大于等于平均值)
double minn=1e10,ans=-1e10;
for(int i=f;i<=n;i++){
minn=min(minn,sum[i-f]);(注意每次改变i,sum[f~i]只多了个sum[i],每次循环只要添加一个sum[i]
ans=max(ans,sum[i]-minn);(找出最大的字段)
}
if(ans>=0)l=mid;//如果ans大于等于平均值,则解大于等于mid
else r=mid;//否则解比平均值小
}
cout<<(ll)(r*1000)<<endl;
return 0;
}
标签:return 方法 条件 namespace 之间 ret font 转化 ace
原文地址:https://www.cnblogs.com/ilikeeatfish/p/12234253.html