当前位置: 首页 > article >正文

机器人搬砖 - 华为OD统一考试

OD统一考试(C卷)

分值: 100分

题解: Java / Python / C++

alt

题目描述

机器人搬砖,一共有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,若是则说明当前充能的能量格数足够,可以减小能量格数,否则需要增加充能的能量格数。

Java

import java.util.Arrays;
import java.util.Scanner;
/**
 * @author code5bug
 */
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        // 读取输入的砖块数
        int[] bricks = Arrays.stream(in.nextLine().split(" "))
                .mapToInt(Integer::parseInt).toArray();

        // 机器人一个小时内只能在一个仓库搬砖, 因此仓库数不能超过 8
        if (bricks.length > 8) {
            System.out.println(-1);
        } else {
            int l = -1, r = Arrays.stream(bricks).max().getAsInt();
            while (l + 1 < r) {
                int m = (l + r) >>> 1;
                if (check(bricks, m)) {
                    r = m;
                } else {
                    l = m;
                }
            }

            System.out.println(r);
        }
    }

    // 判断机器人每小时充 power 能量,能否在 8 个小时内搬完
    private static boolean check(int[] bricks, int power) {
        int days = 0;
        for (int brick : bricks) {
            days += (brick + power - 1) / power;
        }

        return days <= 8;
    }
}

Python

from typing import List


def check(bricks: List[int], power: int) -> bool:
    """判断机器人每小时充 power 能量,能否在 8 个小时内搬完"""
    days = 0
    for brick in bricks:
        days += (brick + power - 1) // power

    return days <= 8


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

C++

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 判断机器人每小时充 power 能量,能否在 8 个小时内搬完
bool check(const vector<int>& bricks, int power) {
    int days = 0;
    for (int brick : bricks) {
        days += (brick + power - 1) / power;
    }

    return days <= 8;
}

int main() {
    vector<int> bricks;
    int brick;
    while (cin >> brick) {
        bricks.push_back(brick);
    }

    // 机器人一个小时内只能在一个仓库搬砖, 因此仓库数不能超过 8
    if (bricks.size() > 8) {
        cout << -1 << endl;
    } else {
        int l = -1, r = *max_element(bricks.begin(), bricks.end());
        while (l + 1 < r) {
            int m = (l + r) / 2;
            if (check(bricks, m)) {
                r = m;
            } else {
                l = m;
            }
        }

        cout << r << endl;
    }

    return 0;
}

相关练习题

题号题目难易
LeetCode 16311631. 最小体力消耗路径中等
LeetCode 22262226. 每个小孩最多能分到多少糖果中等

‍❤️‍华为OD机试面试交流群每日真题分享): 加V时备注“华为od加群”

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


http://www.kler.cn/a/232822.html

相关文章:

  • 使用Docker快速部署FastAPI Web应用
  • git commit 校验
  • 2-UML概念模型测试
  • 快速学习Serde包实现rust对象序列化
  • Oracle RAC的thread
  • 【C++】详细介绍模版进阶,细节满满
  • C++服务器端开发(7):并发处理
  • FolkMQ “单线程“消息中间件(开源) v1.0.32 发布
  • 【笔记】Helm-5 Chart模板指南-8 命名模板
  • 排序算法---堆排序
  • CTF--Web安全--SQL注入之‘绕过方法’
  • 基于ISO13400 (DoIP) 实现车辆刷写
  • 网络编程..
  • 突然,有点不喜欢梅西了
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Span组件
  • 【QT学习十四】 文件目录操作
  • 自然语言NLP
  • 适用于 Windows 的 6 款 iPhone 数据恢复软件
  • 基于微信小程序的新生报到系统的研究与实现,附源码
  • 医学考试搜题答案这7款足够解决问题 #笔记#知识分享#其他
  • SpringBoot源码解读与原理分析(六)WebMvc场景的自动装配
  • 507. Perfect Number(完美数)
  • Python循环语句——for循环临时变量作用域
  • SSL和Kerberos身份验证的区别?
  • 【开源】基于JAVA+Vue+SpringBoot的智慧社区业务综合平台
  • 数学建模-灰色预测最强讲义 GM(1,1)原理及Python实现