二分实数总结

本文深入探讨了二分查找实数算法在求解数组中大于特定长度的最大平均数问题的应用。通过分析单调性原理,阐述了算法的实现细节,并提供了一段C++代码示例,展示了如何通过迭代逼近找到满足条件的平均数。

总结

二分这个算法就不说了,直接上一个题目吧,二分实数看算法竞赛指南上的题解勉强看懂,这题主要是让我求一个一个数组之中大于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两发)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值