1. 程式人生 > >【實數域上的二分,二分答案】POJ 2018 Best Cow Fences

【實數域上的二分,二分答案】POJ 2018 Best Cow Fences

連結

大意

給定一些序列,求出長度至少為m的子序列的平均值最大

思路

因為奶牛的數量不可能為負數,所以該資料具有單調性,考慮二分

程式碼

#include<cstdio>
#include<algorithm>
#define eps (1e-5)
#define re register
#define r(i,a,b) for(re int i=a;i<=b;i++)
using namespace std;int n,m;
double a[100001],s[100001],l=-1e6,r=1e6;
inline bool check()//判斷其平均值是否滿足要求
{ double minn=1e9; r(i,m,n) {minn=min(minn,s[i-m]);if(s[i]-minn>=0) return true;}//我們使左端點儘量小,右端點與左端點的差若能超過0說明滿足要求 return false; } signed main() { scanf("%d%d",&n,&m); r(i,1,n) scanf("%lf",a+i); while(r-l>eps) { double mid=(l+r)/2; r(i,1,n) s[i]=s[~-i]+a[i]-mid; if
(check()) l=mid;else r=mid; } printf("%d",(int)(r*1000));//輸出 }