分石子-牛客网

解决牛客网上的一道分石子题目,目标是通过分裂石子堆得到指定数量的石子堆,求最小值的最大可能。利用二分搜索策略,通过不断调整中间值mid,在满足堆数条件的情况下,找到最小值的最大值。

题目描述

牛牛有n堆石子堆,第i堆一共有ai个石子。
牛牛可以对任意一堆石子数量大于1的石子堆进行分裂操作,分裂成两堆新的石子数量都大于等于1的石子堆。

现在牛牛需要通过分裂得到m堆石子,他想知道这m堆石子的最小值最大可以是多少?

示例1

输入

3,5,[3,5,6]

输出

2

说明

把5分裂成2和3

把6分裂成2和4

得到五堆石子[3,2,3,2,4]

备注:

1≤n≤1e5,n≤m≤∑ai,1≤ai≤1e9

第一个参数n代表石子堆的个数
第二个参数m表示需要得到的石子堆数。
第三个参数vector a代表每堆石子堆的石子个数

思路:令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堆。记所有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值