最佳植树距离 - 华为OD统一考试(E卷)

news2024/11/14 2:06:12

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

华为od机试

题目描述

按照环保公司要求,小明需要在沙化严重的地区进行植树防沙工作,初步目标是种植一条直线的树带。由于有些区域目前不适合种植树木,所以只能在一些可以种植的点来种植树木。

在树苗有限的情况下,要达到最佳效果,就要尽量散开种植,不同树苗之间的最小间距要尽量大。给你一个适合种植树木的点坐标和一个树苗的数量,请帮小明选择一个最佳的最小种植间距。

例如,适合种植树木的位置分别为1,3,5,6,7,10,13 树苗数量是3,种植位置在1,7,13,树苗之间的间距都是6,均匀分开,就达到了散开种植的目的,最佳的最小种植间距是6

输入描述

第1行表示适合种树的坐标数量
第2行是适合种树的坐标位置
第3行是树苗的数量
例如:
7
1 3 5 6 7 10 13
3

输出描述

最佳的最小种植问距

补充说明

位置范围为1~ 10000000,种植树苗的数量范围2 ~ 10000000,用例确保种植的树苗数量不会超过有效种植坐标数量。

示例1

输入:
7
1 3 5 6 7 10 13
3

输出:
6

题解

这道题属于二分查找贪心算法相结合的问题,目的是通过二分查找来确定适合种植树木的最大最小间距。

解题思路

  1. 数据结构选择:
    • 采用一个数组locs存储可种植的点坐标,并对该数组进行排序,便于后续计算。
  2. 二分查找:
    • 间距的范围在1到(最大坐标 - 最小坐标)之间。通过二分查找确定能种下所有树苗的最大最小间距。
    • 在二分查找的过程中,每次计算一个中间值mid,然后检查以此间距mid能否种下所有的树苗。
  3. 贪心判断:
    • 对于每个给定的间距mid,从最左侧的可种植位置开始,贪心地选择每次尽量离上一个种植点最远的位置进行种植。如果种下的树苗数量达到要求,则返回true
  4. 输出:
    • 最后输出通过二分查找找到的最大间距。

代码复杂度

  • 时间复杂度: O(N * log(D)) ,其中N是坐标数量,D是坐标范围(locs[n-1] - locs[0])。
  • 空间复杂度: O(N) ,主要用于存储可种植点的数组。

Java

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author code5bug
 */
public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 适合种树的坐标数量
        int n = scanner.nextInt();
        // 适合种树的坐标位置
        int[] locs = new int[n];
        for (int i = 0; i < n; i++) {
            locs[i] = scanner.nextInt();
        }
        // 对坐标位置进行排序
        Arrays.sort(locs);

        // 树苗的数量
        int szt = scanner.nextInt();

        // 二分查找的边界
        int left = 1;
        int right = locs[n - 1] - locs[0] + 1;

        // 二分查找,找到最大的合适间距
        while (left + 1 < right) {
            int mid = (left + right) / 2;
            if (ok(mid, locs, szt)) {
                left = mid;  // 可以种下 szt 棵树,尝试更大的间距
            } else {
                right = mid;  // 间距太大,尝试更小的间距
            }
        }

        // 输出最大的合适间距
        System.out.println(left);
    }

    // 判断间距为 x 时能否种下 szt 棵树苗
    public static boolean ok(int x, int[] locs, int szt) {
        // prev 表示上一棵树的位置,cnt 表示已种的树数量
        int prev = locs[0], cnt = 1;
        for (int cur : locs) {
            if (cur - prev >= x) {  // 当前距离符合间距要求则在当前位置种下一棵树
                cnt++;
                prev = cur;
            }
        }
        return cnt >= szt;  // 如果能种下足够数量的树苗则返回 true
    }
}

Python

# 适合种树的坐标数量
n = int(input())
# 适合种树的坐标位置
locs = list(map(int, input().split()))
locs.sort()
# 树苗的数量
szt = int(input())

def ok(x:int) -> bool:
    ''' 种植间距为x 时能否种下 szt 颗树苗'''
    global locs, szt
    # 上一颗种树的位置,已经种的树数量
    prev, cnt = locs[0], 1
    for cur in locs:
        if cur - prev >= x: # 当前距离符合间距要求则在当前位置种下一棵树
            cnt += 1
            prev = cur

    return cnt >= szt

left, right = 1, locs[-1] - locs[0] + 1
while left + 1 < right:
    mid = (left + right) // 2
    if ok(mid):
        left = mid
    else:
        right = mid

print(left)


'''
7
1 5 3 6 10 7 13
3
'''
# AC 

C++

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


using namespace std;

// 种植间距为x 时能否种下 szt 颗树苗
bool ok(int x, const vector<int>& locs, int szt)
{
    // prev 表示上一棵树的位置,cnt 表示已种的树数量
    int prev = locs[0], cnt = 1;
    for (int cur : locs) {
        if (cur - prev >= x) {   // 当前距离符合间距要求则在当前位置种下一棵树
            cnt++;
            prev = cur;
        }
    }
    return cnt >= szt;   // 如果能种下足够数量的树苗则返回 true
}

int main()
{
    // 适合种树的坐标数量
    int n;
    cin >> n;

    // 适合种树的坐标位置
    vector<int> locs(n);
    for (int i = 0; i < n; i++) {
        cin >> locs[i];
    }

    // 对坐标位置进行排序
    sort(locs.begin(), locs.end());

    // 树苗的数量
    int szt;
    cin >> szt;

    // 二分查找的边界
    int left  = 1;
    int right = locs[n - 1] - locs[0] + 1;

    // 二分查找,找到最大的合适间距
    while (left + 1 < right) {
        int mid = (left + right) / 2;
        if (ok(mid, locs, szt)) {
            left = mid;   // 可以种下 szt 棵树,尝试更大的间距
        } else {
            right = mid;   // 间距太大,尝试更小的间距
        }
    }

    // 输出最大的合适间距
    cout << left << endl;

    return 0;
}

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

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

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

相关文章

橙子质量检测系统源码分享

橙子质量检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

【报告阅读】chatgpt-o1 技术报告阅读 | 新的迭代开始了~

OpenAI o1是通过强化学习去进行复杂推理&#xff0c;在它回答之前&#xff0c;他会经过复杂的内部思维链的思考。 经过强化训练的o1多强 1 表现 在美国数学奥林匹克预选赛中名列前500名的学生中&#xff0c;o1排89名 在物理、生物、化学问题的基准测试中超过人类博士水平 其…

stm32单片机个人学习笔记7(TIM定时中断)

前言 本篇文章属于stm32单片机&#xff08;以下简称单片机&#xff09;的学习笔记&#xff0c;来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 STM32入门教程-2023版 细…

Python可迭代对象(1)---从C++开发者学习python日记

目录 1。什么是可迭代对象&#xff1f; 2。列表(list) 列表的创建 列表基本操作 以上全部代码的总运行结果 列表脚本操作符 列表常用的方法和函数 列表推导式 ​编辑列表的嵌套 以上全部代码的总运行结果 复习列表内容 3。元组(tuple) 元组的基本运算 元组的方法 …

SFUD库移植

1.源码 GitHub - armink/SFUD: An using JEDECs SFDP standard serial (SPI) flash universal driver library | 一款使用 JEDEC SFDP 标准的串行 (SPI) Flash 通用驱动库 2.介绍 这个通用驱动库,实际就是帮你封装好了读写spiflash的函数, 我们只需要对接以下底层,就可以轻松…

快速了解使用路由器

插槽的使用和用法&#xff1a;slot 为什么要使用插槽&#xff1a; 在Vue.js等前端框架中 在Vue.js等前端框架中&#xff0c;插槽&#xff08;Slot&#xff09;是一种强大的工具&#xff0c;允许开发者在组件之间动态地传递和呈现内容。使用插槽的主要原因包括&#xff1a; …

【LTW】Domain General Face Forgery Detection by Learning to Weight

文章目录 Domain General Face Forgery Detection by Learning to Weightkey points方法LTW元分割策略学习过程损失函数实验评价结果消融实验总结Domain General Face Forgery Detection by Learning to Weight 会议:AAAI-21 作者: code: https://github.com/skJack/LTW 上…

用uniapp 及socket.io做一个简单聊天 升级 9

比这之前优化了以下功能 上线通知 群聊里适时显示在线人数 约请好友 通过好友通过socket 相应端自动变化 PC端可以拉取摄象头拍照 PC端可以录音发送 拉起摄象头发送录象 <template><view class""><scroll-view scroll-y"true" class&…

2024 离线ASR和TTS推荐与示例

2024 离线ASR和TTS推荐 文章目录 2024 离线ASR和TTS推荐一、前言二、安装与使用1、EdgeTTS的安装和使用&#xff08;1&#xff09;Edge TTS介绍与效果试听&#xff08;2&#xff09;Edge TTS安装&#xff08;3&#xff09;Edge TTS查看支持的音色&#xff08;4&#xff09;Edge…

16【Protues51单片机仿真】智能洗衣机倒计时系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 用直流电机转动模拟洗衣机。要求 有弱洗、普通洗、强洗三种模式&#xff0c;可通过按键选择。可以设置洗衣时长&#xff0c;通关按键选择15、30、45、60、90分钟。时间到蜂鸣器报警提示。LCD 显示…

MySQL:事务的ACID特性隔离级别脏读/不可重复读/幻读/Next-Key锁——场景复现

目录 1、什么是事务 2、 事务的ACID特性 2.1 事务的隔离性 3、为什么要使用事务&#xff1f; 4、查看支持事务的存储引擎 5、使用事务 5.1 控制事务 5.1.1 开启事务 5.1.2 关闭事务 5.2 开始一个事务&#xff0c;执行修改后回滚 5.3 开始一个事务&#xff0c;执行修…

set-ExecutionPolicy RemoteSigned 提示不是内部或外部命令,也不是可运行的程序或批处理文件

这个错误一般发生在使用命令提示符或者PowerShell窗口中找不到set-ExecutionPolicy RemoteSigned。如果你想在命令提示符或者PowerShell窗口运行set-ExecutionPolicy RemoteSigned&#xff0c;你需要搜索打开Window PowerShell ISE&#xff0c;并以管理员身份打开&#xff0c;输…

图结构感知的Transformer:一种新的图表示学习方法

人工智能咨询培训老师叶梓 转载标明出处 尽管图神经网络&#xff08;GNNs&#xff09;在处理图数据方面取得了显著成就&#xff0c;但它们在表达能力和捕获长距离依赖方面存在局限性。为了突破这些局限&#xff0c;研究者们开始探索将Transformer架构应用于图表示学习。在此基…

使用Electron打包一个Vue3项目全步骤

1.创建一个Vue3项目 2.使用 WebStorm打开项目&#xff0c;并安装依赖项 npm install 等待完成后&#xff0c; 安装electron npm install --save-dev electron 等待完成后&#xff0c; 安装electron 打包依赖项(打包成可执行文件) npm install electron-packager --save-dev 3…

从零开始一个git操作实例,图文并茂

徒弟不懂git怎么用&#xff0c; 于是写了篇文章&#xff0c; 把本地git操作从头写了一遍&#xff0c; 自己去看吧&#xff01; 0、基本概念 •Git是一个免费、开源的、分布式版本控制系统 •它使用一个特殊的叫做仓库的数据库来记录文件的变化 •仓库中的每个文件都有一个…

ccfcsp-202406(1、2、3、4、5)

矩阵重塑&#xff08;其一&#xff09; #include <bits/stdc.h> using namespace std; int main() {int n,m,p,q;cin >> n >> m >> p >> q;vector<int> vec(n * m);vector<vector<int>> res(p, vector(q,0));int k 0;for(in…

力扣反转链表系列【25. K 个一组翻转链表】——由易到难,一次刷通!!!

力扣《反转链表》系列文章目录 刷题次序&#xff0c;由易到难&#xff0c;一次刷通&#xff01;&#xff01;&#xff01; 题目题解206. 反转链表反转链表的全部 题解192. 反转链表 II反转链表的指定段 题解224. 两两交换链表中的节点两个一组反转链表 题解325. K 个一组翻转…

HarmonyOS---权限和http/Axios网络请求

网络请求(http,axios) 目录 一、应用权限管理1.1权限的等级1.2授权方式1.3声明权限的配置1.4如何向用户进行申请 二、内置http请求使用三、Axios请求使用&#xff08;建议&#xff09;3.1 使用方式一3.2 使用方式二&#xff08;建议&#xff09; 一、应用权限管理 应用权限保护…

git仓库服务器端损坏如何用本地code重新部署

文章目录 1. **在新服务器上创建一个新的 Git 仓库**2. **将本地仓库推送到新服务器**2.1. 添加新服务器为远程仓库2.2. 推送代码和历史记录2.3. 推送 tags&#xff08;如果有 tags&#xff09; 3. **在新服务器上拉取代码并部署**4. **确保修改记录和历史完整**5. **可选&…

Flink Task 日志文件隔离

Flink Task 日志文件隔离 任务在启动时会先通过 MdcUtils 启动一个 slf4j 的 MDC 环境&#xff0c;然后将 jobId 添加到 slf4j 的 MDC 容器中&#xff0c;随后任务输出的日志都将附带 joid。 MDC 介绍如下&#xff1a; MDC ( Mapped Diagnostic Contexts )&#xff0c;它是一个…