华为od机试真题:机器人搬砖(Python)

华为od机试题库

题目描述

机器人搬砖,一共有N堆砖存放在N个不同的仓库中,第 i 堆中有 bricks[i] 块砖头,要求在8小时内搬完。

机器人每小时能搬砖的数量取决于有多少能量格,机器人一个小时中只能在一仓库中搬砖,机器人的能量格每小时补充一次且能量格只在这一个小时有效,为使得机器人损耗最小化,应尽量减小每次补充的能量格数。

为了保障在8小时内能完成砖任务,请计算每小时始机器人充能的最小能量格数。

备注:

1、无需考虑机器人补充能量的耗时

2、无需考虑机器人搬砖的耗时

3、机器人每小时补充能量格只在这一个小时中有效

输入描述

程序有输入为“30 12 25 8 19”一个整数数组,数组中的每个数字代表第i堆砖的个数,每堆砖的个数不超过100

输出描述

输出在8小时内完成搬砖任务,机器人每小时最少需要充多少个能量格;

如果8个小时内无法完成任务,则输出“-1”;

示例1

输入:
30 12 25 8 19

输出:
15

示例2

输入:
10 12 25 8 19 8 6 4 17 19 20 30

输出:
-1

说明:
砖的堆数为12堆存放在12个仓库中,机器人一个小时内只能在一个仓库搬砖,不可能完成任务

题解

解题思路:

  1. 题目要求机器人在8小时内搬完N堆砖,每小时搬砖的数量取决于机器人每小时充能的能量格数。
  2. 机器人每小时只能在一个仓库搬砖,因此仓库数不能超过8。
  3. 需要计算每小时机器人充能的最小能量格数,使得能够在8小时内完成搬砖任务。
  4. 使用二分查找的思想,通过不断调整充能的能量格数,找到一个最小的能量格数,使得在8小时内能够完成搬砖任务。
  5. 判断条件为每小时搬砖的天数是否小于等于8,若是则说明当前充能的能量格数足够,可以减小能量格数,否则需要增加充能的能量格数。

Python

from typing import List


def check(bricks: List[int], power: int) -> bool:
    """判断机器人每小时充 power 能量,能否在 8 个小时内搬完"""
    cost = 0 # 仓库搬砖总耗时(单位:小时)
    for brick in bricks:
        # 向上取整
        cost += (brick + power - 1) // power

    return cost <= 8


if __name__ == '__main__':
    bricks = list(map(int, input().split()))
    if len(bricks) > 8:  # 机器人一个小时内只能在一个仓库搬砖,因此仓库数不能超过 8
        print(-1)
        return
    
    l, r = -1, max(bricks)
    while l + 1 < r:
        m = (l + r) >> 1
        if check(bricks, m):
            r = m
        else:
            l = m
    print(r)

相关练习题

alt

2024华为OD机试(C卷+D卷)最新题库【超值优惠】Java/Python/C++合集

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

#面经##华为od题库##华为od##秋招##校招#
全部评论

相关推荐

3 1 评论
分享
牛客网
牛客企业服务