码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2018

时间:2020-01-26 15:52:09      阅读:39      评论:0      收藏:0      [点我收藏+]

标签: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;
}

POJ 2018

标签:return   方法   条件   namespace   之间   ret   font   转化   ace   

原文地址:https://www.cnblogs.com/ilikeeatfish/p/12234253.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!