【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 机器人搬砖(100分) - 三语言AC题解(Python/Java/Cpp)

news2024/10/24 4:33:57

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员

✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解

💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导

👏 感谢大家的订阅➕ 和 喜欢💗

📎在线评测链接

https://app5938.acapp.acwing.com.cn/contest/2/problem/OD1061
🌍 评测功能需要 ⇒ 订阅专栏 ⇐ 后私信联系清隆解锁~

🍓OJ题目截图

在这里插入图片描述

文章目录

    • 📎在线评测链接
    • 🍓OJ题目截图
    • 🎧 机器人搬砖
      • 问题描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 样例输入
      • 样例输出
      • 数据范围
      • 题解
      • 参考代码

🎧 机器人搬砖

问题描述

K小姐的仓库里有 N N N 堆砖块,第 i i i 堆中有 b r i c k s [ i ] bricks[i] bricks[i] 块砖。她的机器人需要在 8 8 8 小时内将所有砖块搬完。机器人每小时可以搬运的砖块数量取决于它的能量格数。为了尽量减少机器人的损耗,K小姐希望每次给机器人充能时,能量格数尽可能少。

已知机器人每小时只能在一个仓库搬砖,且每次充能获得的能量格只在当前小时内有效。请你帮助K小姐计算出,为了在 8 8 8 小时内完成搬砖任务,每次给机器人充能时最少需要多少能量格。

输入格式

输入一行,包含若干个用空格分隔的正整数,分别表示每堆砖块的数量,即 b r i c k s [ 1 ] bricks[1] bricks[1] b r i c k s [ N ] bricks[N] bricks[N]

输出格式

输出一个整数,表示每次给机器人充能时最少需要的能量格数。

8 8 8 小时内无法完成搬砖任务,则输出 − 1 -1 1

样例输入

30 12 25 8 19

样例输出

15

样例输入

10 12 25 8 19 8 6 4 17 19 20 30

样例输出

-1

数据范围

  • 1 ≤ N ≤ 100 1 \le N \le 100 1N100
  • 1 ≤ b r i c k s [ i ] ≤ 100 1 \le bricks[i] \le 100 1bricks[i]100

题解

本题可以使用二分查找的思路来解决。我们可以把每次充能的能量格数作为二分查找的目标值,判断在该能量格数下是否能在 8 8 8 小时内完成搬砖任务。

具体做法如下:

  1. 初始化二分查找的区间为 [ 1 , m a x ( b r i c k s ) ] [1, max(bricks)] [1,max(bricks)],其中 m a x ( b r i c k s ) max(bricks) max(bricks) 表示所有堆砖块数量的最大值。

  2. 在每次二分查找的过程中,取区间的中点作为当前的能量格数 m i d mid mid

  3. 遍历每堆砖块,计算出搬完所有砖块需要的总时间 n u m num num,其中搬完第 i i i 堆砖块需要的时间为 ⌈ b r i c k s [ i ] m i d ⌉ \lceil \frac{bricks[i]}{mid} \rceil midbricks[i]

  4. 如果 n u m ≤ 8 num \le 8 num8,说明当前的能量格数 m i d mid mid 可以满足要求,我们继续在 [ 1 , m i d ] [1, mid] [1,mid] 的范围内进行二分查找;否则,我们在 [ m i d + 1 , m a x ( b r i c k s ) ] [mid+1, max(bricks)] [mid+1,max(bricks)] 的范围内进行二分查找。

  5. 当二分查找的区间左右端点相等时,搜索结束,返回最终的能量格数即可。

  6. 如果搜索结束时,最终的能量格数仍无法满足在 8 8 8 小时内完成搬砖任务,就返回 − 1 -1 1

参考代码

  • Python
def min_energy(bricks):
    n = len(bricks)
    if n > 8:
        return -1

    left, right = 1, max(bricks)
    while left < right:
        mid = (left + right) // 2
        num = sum((x + mid - 1) // mid for x in bricks)
        if num <= 8:
            right = mid
        else:
            left = mid + 1

    return left

bricks = list(map(int, input().split()))
print(min_energy(bricks))
  • Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String[] input = scanner.nextLine().split(" ");
        int n = input.length;
        int[] bricks = new int[n];
        for (int i = 0; i < n; i++) {
            bricks[i] = Integer.parseInt(input[i]);
        }
        System.out.println(minEnergy(bricks));
    }

    private static int minEnergy(int[] bricks) {
        int n = bricks.length;
        if (n > 8) {
            return -1;
        }

        int left = 1, right = 0;
        for (int x : bricks) {
            right = Math.max(right, x);
        }

        while (left < right) {
            int mid = left + (right - left) / 2;
            int num = 0;
            for (int x : bricks) {
                num += (x + mid - 1) / mid;
            }
            if (num <= 8) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }

        return left;
    }
}
  • Cpp
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int minEnergy(vector<int>& bricks) {
    int n = bricks.size();
    if (n > 8) {
        return -1;
    }

    int left = 1, right = *max_element(bricks.begin(), bricks.end());
    while (left < right) {
        int mid = left + (right - left) / 2;
        int num = 0;
        for (int x : bricks) {
            num += (x + mid - 1) / mid;
        }
        if (num <= 8) {
            right = mid;
        } else {
            left = mid + 1;
        }
    }

    return left;
}

int main() {
    string input;
    getline(cin, input);
    
    vector<int> bricks;
    size_t pos = 0;
    while ((pos = input.find(' ')) != string::npos) {
        bricks.push_back(stoi(input.substr(0, pos)));
        input.erase(0, pos + 1);
    }
    bricks.push_back(stoi(input));

    cout << minEnergy(bricks) << endl;

    return 0;
}

时间复杂度: O ( N log ⁡ M ) O(N \log M) O(NlogM),其中 N N N 是砖堆的数量, M M M 是砖块数量的最大值。二分查找的次数为 O ( log ⁡ M ) O(\log M) O(logM),每次二分查找需要遍历所有砖堆,耗时 O ( N ) O(N) O(N)

空间复杂度: O ( 1 ) O(1) O(1)。只需要常数级别的额外空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1843017.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全网最易懂,开源时序数据库influxDB,实际应用评测

前言&#xff1a; 当今是信息爆炸的时代&#xff0c;在处理高频数据时&#xff0c;关系型数据库oracle/mysql明显表现出乏力&#xff0c;因秒级、毫秒级高频数据&#xff0c;分分钟可以把关系型数据库的表塞爆。在日常生活工作中&#xff0c;我们经常会遇到哪些需要高频分析的场…

令人震撼的人类智慧的科学领域-AI技术

AI&#xff0c;全称为人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;是一门致力于让机器模仿人类智慧的科学领域。其核心技术涵盖了机器学习、自然语言处理、计算机视觉及专家系统等多个方面。AI旨在开发能够感知环境、进行逻辑推理、自主学习并做出决策…

Leetcode 力扣124. 二叉树中的最大路径和 (抖音号:708231408)

二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root &#xff0c…

基于JSP的二手交易平台网站

开头语&#xff1a; 你好&#xff0c;我是计算机专业的学长猫哥。如果你对二手交易平台感兴趣或有开发相关需求&#xff0c;欢迎联系我&#xff0c;我的联系方式见文末。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;ECLI…

vue3 antdv Select 实现输入关键词,通过服务器去查询数据,并显示到表格中的实现思路。

实现思路&#xff1a; 1&#xff09;输入关键词&#xff0c;通过Select的查询事件&#xff08;onSearch&#xff09;来到服务器查询数据。 2&#xff09;根据查询到的数据显示到表格中&#xff0c;然后通过表格的&#xff08;cellClickEvent&#xff09;事件来选择相关的用户…

第四届人工智能、机器人和通信国际会议(ICAIRC 2024)

第四届人工智能、机器人和通信国际会议&#xff08;ICAIRC 2024&#xff09; 2024 4th International Conference on Artificial Intelligence, Robotics, and Communication 2024年12月27-29日 | 中国厦门 重要信息 会议官网&#xff1a;www.icairc.net 录用通知时间&…

视觉应用线扫相机速度反馈(倍福CX7000PLC应用)

运动控制实时总线相关内容请参考运动控制专栏,这里不再赘述 1、运动控制常用单位u/s运动控制单位[u/s]介绍_运动控制 unit是什么单位-CSDN博客文章浏览阅读176次。运动控制很多手册上会写这样的单位,这里的u是英文单词unit的缩写,也就是单位的意思,所以这里的单位不是微米…

阿里云服务器提醒漏洞要不要打补丁?

我们自己用的电脑一旦发现漏洞&#xff0c;往往是第一时间进行打补丁重启等等&#xff0c;但是作为服务器而言&#xff0c;往往没有这个习惯&#xff0c;为什么&#xff1f;因为害怕服务器打补丁以后&#xff0c;重启后出现打不开的情况&#xff0c;毕竟稳定的运行似乎在这种情…

免费企业级日志采集工具

免费试用下载: Gitee下载 最新版本 优势: A. 开箱即用. 解压直接运行.不需额外安装. B. 批管理设备. 设备配置均在后台管理. C. 无人值守 客户端自启动,自更新. D. 稳定安全. 架构简单,内存占用小,通过授权访问.

rust数据类型

一&#xff0c;基本类型 1&#xff0c;基本类型 &#xff08;1&#xff09;整数类型 let x111_222_3334;let y:u161123; 整数默认是i32类型&#xff0c;整数中间的下划线可以忽略。 &#xff08;2&#xff09;浮点数 在 Rust 中浮点类型数字也有两种基本类型&#xff1a; …

停车场防逃费设备有哪些,捷曜超眸相机怎么样,有哪些功能?

在当今快速发展的城市交通环境中&#xff0c;车场管理面临着诸多挑战&#xff0c;其中防逃费现象尤为突出。频繁的逃费行为不仅给车场运营带来了经济损失&#xff0c;也严重影响了停车场的正常秩序。对于车场防逃费方案中&#xff0c;超眸相机&#xff0c;以其尖端的高清成像技…

企业微信集成策略:打破壁垒,驱动企业数字化转型

随着全球化和数字化的快速推进&#xff0c;企业如何在激烈的市场竞争中脱颖而出&#xff0c;成为每个企业家和决策者关注的焦点。腾讯推出的企业微信&#xff0c;作为一款集沟通、协作、管理于一体的企业通讯与办公工具&#xff0c;正逐步成为企业数字化转型的得力助手。NetFar…

类型“Element”上不存在属性“ondragstart”

先上一下代码&#xff1a; //初始化拖动源事件function initDragSourceNode() {const moveDom document.querySelector(.drag); //拖动元素// console.log(moveDom:, moveDom);moveDom!.ondragstart function (e) {// console.log(拖动开始);};moveDom.ondrag function (e)…

CRMEB 多门店安装系统配置清单

系统在安装完成之后&#xff0c;需要对系统进行一系列的配置&#xff0c;才能正常使用全部的功能&#xff0c;以下是官方整理的配置清单

SEO之预估流量及价值(二)

初创企业搭建网站的朋友看1号文章&#xff1b;想学习云计算&#xff0c;怎么入门看2号文章谢谢支持&#xff1a; 1、我给不会敲代码又想搭建网站的人建议 2、新手上云 &#xff08;接上一篇。。。。&#xff09; 2、点击率 搜索结果页面各排名位置点击率也不精确。前面介绍的…

【第13章】进阶调试思路:如何安装复杂节点IP-Adapter?(安装/复杂报错/节点详情页/精读)ComfyUI基础入门教程

🎈背景 IP-Adapter这个名字,大家可能听说过,可以让生成的结果从参考图中学习人物、画风的一致性,在目前是比较实用的一个节点,广泛的用于照片绘制、电商作图等方面。 但同时,这个节点也是比较难安装的一个节点。 所以,这节课,我们就通过一个案例,来学习如何在Comf…

食品快消品进销存+门店批发+零售商城整体代码输出

食品快消品行业在当今信息化和数字化浪潮中&#xff0c;建立批发零售的信息化系统已成为一种迫切的必要性。通过信息化&#xff0c;食品快消品企业能够实现从生产到销售的全面优化&#xff0c;提高供应链效率&#xff0c;降低运营成本&#xff0c;增强市场竞争力。通过有效的信…

网络安全管理组织架构复习

文章目录 安全管理机构岗位设置安全要求要求解读 安全管理机构 安全管理的重要实施条件就是有一个统一指挥、协调有序、组织有力的安全管理机构,这是网络安全管理得以实施、推广的基础。 通过构建从单位最高管理层到执行层及具体业务运营层的组织体系&#xff0c;可以明确各个…

2024年最热门的5款国产AI画图软件推荐

前言 AI绘画软件正在彻底改变艺术创作和视觉设计的面貌&#xff0c;而国产软件的兴起更是为这一变革注入了新的活力。 它们不仅提升了设计的效率&#xff0c;还极大地拓宽了创意的边界。2024年&#xff0c;我们见证了多款国产AI画图软件的火爆&#xff0c;它们以其强大的功能…

AI融资热潮:Genspark、Finaloop等初创吸金不断!中国气象局发布三大AI模型

文章推荐 AI日报&#xff5c;跃问App上架加入AI助理竞争&#xff01;GPTZero获千万美元A轮融资&#xff0c;创始人不到30岁&#xff01; AI日报&#xff5c;Luma推出AI视频模型&#xff0c;又一Sora级选手登场&#xff1f;SD3 Medium发布&#xff0c;图中文效果改善明显 ⭐️…