题目描述
机器人搬砖,一共有N堆砖存放在N个不同的仓库中,第i堆砖中有bricks[i]块砖头,要求在8小时内搬完。机器人每小时能搬砖的数量取决于有多少能量格,机器人一个小时中只能在一个仓库中搬砖,机器人的能量格每小时补充一次且能量格只在这一个小时有效,为使得机器人损耗最小化尽量减小每次补充的能量格数 为了保障在8小时内能完成搬砖任务,请计算每小时给机器人充能的最小能量格数。
1、无需考虑机器人补充能量格的耗时,
2、无需考虑机器人搬砖的耗时;
3、机器人每小时补充能量格只在这一个小时中有效;
输入描述
第一行为一行数字,空格分隔
输出描述
机器人每小时最少需要充的能量格,若无法完成任务,输出 -1
示例1
输入 | 30 12 25 8 19 |
---|---|
输出 | 15 |
示例2
输入 | 10 12 25 8 19 8 6 4 17 19 20 30 |
---|---|
输出 | -1 |
解题思路
-
首先,检查砖块的数量是否大于8,如果大于8,则返回-1。在本例中,砖块数量为5,因此不返回-1。
-
初始化左右边界
left
和right
。left
设置为1(因为至少需要每小时1块能量),right
设置为数组中的最大值(即30)。 -
进入
while
循环执行二分查找。这个循环将不断缩小搜索范围直到找到最小的每小时能量块数量。 -
在每次循环中,计算中间值
middle
,然后计算使用middle
作为每小时能量块数量时,完成搬运所有砖块需要的总时间total_time
。 -
如果
total_time
大于hours
,说明middle
太小,不能在规定时间内完成任务,因此将left
设置为middle + 1
。 -
如果
total_time
小于等于hours
,说明middle
可能太大或刚好合适,因此将right
设置为middle
以尝试找到更小的值。 -
当
left
和right
相遇时,循环结束,此时left
即为我们寻找的最小能量块数量。 -
最后,再次计算使用
left
作为每小时能量块数量时,完成搬运所有砖块需要的总时间sum
。如果sum
大于hours
,说明即使是left
也不能在