二分實數總結

總結

二分這個算法就不說了,直接上一個題目吧,二分實數看算法競賽指南上的題解勉強看懂,這題主要是讓我求一個一個數組之中大於L長度的最大平均數。
書上大概都有,我就簡單說下單調性吧。任意數列減去自己的平均數後總和爲0如果一個數字小於平均值的話,減去這個數字後總和將會大於0,而如果大於平均值的話總和將會變成一個負數,由此可以看出平均值的單調性。

#include<stdio.h>
#include<algorithm>
using namespace std;
const double eps=1e-7;
int main()
{
    int n,i,k;
    double l,r,a[100006],b[100006];
    scanf("%d %d",&n,&k);
    for(i=1;i<=n;i++)
    scanf("%lf",&a[i]);
    l=-20000,r=20000;
    while(l+eps<r)
    {
        double mid=(l+r)/2;
        for(i=1;i<=n;i++) b[i]=a[i]-mid;
        double sum[100006],minn=1e5,ans=-1e6;
        sum[0]=0;
        for(i=1;i<=n;i++)
        {
            sum[i]=b[i]+sum[i-1];
        }
        for(i=k;i<=n;i++)
        {
            minn=min(minn,sum[i-k]);
            ans=max(ans,sum[i]-minn);
        }
        if(ans>=0) l=mid;
        else r=mid;
    }
    int ans=r*1000;
    printf("%d",ans);
    return 0;
}

對於二分實數來說,一般eps=1e-(k+2),k爲精確度,在判斷時不能加一個eps!!!(蒟蒻親測,加了eps後wa兩發)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章