0x04 二分

二分、三分其实没什么。。

但是真心觉得市面上的朴素二分打法千奇百怪,假如是像我的标程应该是比较稳妥的,然而poj2018那题(前缀和又想起来了)是向下取整,精度有点问题(经常拍出一些什么xxx.99999的,我觉得是他标准输出有毒)遂像他那样打就过了

二分感觉上最大的用途就是把某个问题转换成判定性问题吧,具体的话,我觉得是对于某个题目,有几个变化的值,通过二分确定其中一个来简化问题?

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;

int n,L;
double a[110000],s[110000];
bool check(double mid)
{
    s[0]=0.0;
    for(int i=1;i<=n;i++)
        a[i]-=mid, s[i]=s[i-1]+a[i];
    for(int i=1;i<=n;i++)a[i]+=mid;
    
    bool bk=false;
    double mmin=999999999.9;
    for(int i=L;i<=n;i++)
    {
        mmin=min(mmin,s[i-L]);
        if( s[i]-mmin > 1e-10 )return true;
    }
    return false;
}

int main()
{
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    scanf("%d%d",&n,&L);
    
    double l=0.0,r=0.0,ans;
    for(int i=1;i<=n;i++)scanf("%lf",&a[i]),r=max(r,a[i]);
    while(r-l>=1e-6)
    {
        double mid=(l+r)/2;
        if(check(mid)==true)l=mid;
        else r=mid;
    }
    printf("%d\n",(int)(r*1000));
    return 0;
}
poj2018(对于卡精题感觉没什么意思,浪费我一个小时)

猜你喜欢

转载自www.cnblogs.com/AKCqhzdy/p/9235854.html
今日推荐