二分算法的理解

1、好题

洛谷p1182数列分段

二分算法区别于其他算法本质:化求解为判定,降低难度

更仔细点就是:

#个人认为,二分答案由“二分”和“答案”组成。宏观上,二分,是对问题状态空间的一种遍历方式,主要作用是降低时间复杂度;
#答案,即枚举答案,则是一种解题方法,主要作用是化求解为判定,降低难度。

#二分的本质:化求解为判定,降低难度

#个人认为,二分答案由“二分”和“答案”组成。宏观上,二分,是对问题状态空间的一种遍历方式,主要作用是降低时间复杂度;
#答案,即枚举答案,则是一种解题方法,主要作用是化求解为判定,降低难度。
n,m=map(int,input().split())
ls=list(map(int,input().split()))

left,right=max(ls),sum(ls)#最小和、最大和

#其实可以在最小和和最大和直接遍历,但是为了加速,使用二分查找
ans=0

#其中,check函数的作用在于给定一个和MaxSum,在数组arr中找到根据该给定和可以分成多少组,
#最后将最后分得组数和指定组数m做对比,然后指导下一步操作。
def check(mid):
    Sum,cnt=0,1
    for num in ls:#截成cnt段数,每一段数的总和小于等于mid
        if Sum+num<=mid:
            Sum+=num
        else:
            Sum=num#截断
            cnt+=1
    return cnt<=m#枚举的和太大,导致分段太少,要让和小一点



while left<=right:
    mid=(left+right)//2
    if check(mid):#枚举的和太大
        ans=mid
        right=mid-1
    else:#枚举和太小
        left=mid+1

print(ans)

好的题解链接:

题解 P1182 【数列分段 Section II】 - My Blog(Legacy) - 洛谷博客

P1182 【数列分段 Section II】Python题解 - Jezemy 的博客 - 洛谷博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值