分石子

分石子

http://www.nowcoder.com/questionTerminal/1ea5b4eaeff841a4918931791b000756

分石子问题

题解源自:牛客大佬——745599318

思路:
#令res表示分裂后m堆的最小值,
#res一定在[1, min{a[i], i=0,1...,n-1}]区间内,记左右区间分别为left, right。
#mid初始值去区间中值,即mid=left+(right-left)/2,利用二分思想不断找到mid的最终值。
#因为要求最小值最大,所以分堆的时候会尽量使每一堆的数据尽量均匀且接近最小值mid,
#具体地,对于其中一对a[i],在最小堆值为mid的条件下,最多可分为a[i]/mid堆。
#记所有堆可分别的堆数位cnt(a[0]/mid+....+a[n-1]/mid),
#若cnt<m,堆数不够,需减小mid,设右边界right=mid-1;
#若cnt>m,需增大mid,设左边界left=mid+1;
#若cnt==m,也不一定就是最终答案,因为mid稍微增大一点可能cnt的值并不会改变,还要继续向后找,left=mid+1.

class Solution:
    def solve(self , n , m , a ):
        if n == m: return min(a)
        left, right = 1, min(a)
        while left<right:
            mid = (left+right+1) >> 1  #二分法取mid值;
            total = sum(nums//mid for nums in a) #当mid为分m堆后的最小值时,共可以分total堆;
            if total >= m:
                left = mid  #当最小值为mid的时候,堆数大于等于m,说明mid可能最小值中的最大也可能不是,说不定mid也满足total = m;
            else:
                right = mid-1 #total小于m,说明mid大了,分得堆数小于m,需要减小m
        return left
全部评论

相关推荐

今天 17:30
门头沟学院 Java
点赞 评论 收藏
分享
09-01 13:50
已编辑
字节跳动_客户端开发
不演了是吧,来吧,那就互爆,聊天记录.........................................................................................................................................................................................................................................!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!在此,请允许小弟我先诚恳的道个歉,这个标题是引流的。听说字节今年要招5000人,小弟也不知道最终这个数字具体是真是假,小弟目前能做的就是附上内推码并将各位兄弟姐妹们的流程跟进到底,小弟的🐎如下:【内推码:883G76D】(听说用这个内推码投递的都进字节了?)投递链接:https://job.toutiao.com/s/nSVy8-JLz6g最后,无论大家目前学历如何,当前面试过没过,最终会不会选择字节,小弟内心衷心祝愿大家最后都能收获满意的offer。如果大家有关于字节的公司文化、面试招聘、团队氛围、公司食堂、福利待遇等任何问题,大家可以在评论区互相讨论呦,小弟也定当知无不言!引流:
迷茫的大四🐶:输入内推码就能进入字节了吗
投递字节跳动等公司10个岗位
点赞 评论 收藏
分享
评论
3
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务