POJ 2018

Posted ilikeeatfish

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2018相关的知识,希望对你有一定的参考价值。

牛的数量<=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的主要内容,如果未能解决你的问题,请参考以下文章

18.06.03 POJ 4126:DNA 15年程设期末05(状压DP)

poj 1011 sticks 解题。

POJ-2018(二分)

贪心算法----区间覆盖问题(POJ2376)

G - Best Cow Fences (POJ - 2018)

PHP必用代码片段