#10012. 「一本通 1.2 例 2」Best Cow Fences 【 二分答案 】【 巧妙 】
阿新 • • 發佈:2018-12-10
樣例輸入:
10 6
6 4 2 10 3 8 5 9 4 1
樣例輸出:
6500
將原問題轉化為: 判定 " 是否存在一個長度不小於L 的區間,區間的平均數不小於二分的值 "
精度問題,請注意!
AC程式碼:
//是否存在一個長度不小於L的區間,使得平均數不小於二分的值 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #define N 100007 #define inf 0x3f3f3f3f using namespace std; const double Eps = 1e-5 ; inline int wread(){ char c=getchar ();int flag=1,wans=0; while (c<'0'||c>'9'){if (c=='-') flag=-1;c=getchar ();} while (c>='0'&&c<='9'){wans=wans*10+c-'0';c=getchar ();} return wans*=flag; } int n,a[N],m; int l,r; double b[N]={0}; bool check (int mid){ double x=mid*1.0/1000; double cmp=inf; for (int i=1;i<=n;++i){ if (i>=m) cmp=min(cmp,b[i-m]); b[i]=b[i-1]-x+(double)a[i]; double pr=b[i]-cmp; if (pr>= -Eps) return true; } return false; } int main (){ n=wread();m=wread(); l=inf;r=-inf; for (int i=1;i<=n;++i) a[i]=wread(),l=min (l,a[i]),r=max(r,a[i]); l*=1000,r*=1000; int ans=0; while (l<=r){ int mid=(l+r)>>1; if (check (mid)) ans=mid,l=mid+1; else r=mid-1; } printf("%d\n",ans); return 0; }