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

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(m

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

华为OD机试题库题解2024 文章被收录于专栏

华为OD机考(CDE卷)题库(绝对都是原题),帮助你上岸华为(已经不少小伙伴成功上岸)。提供Java、Python、C++ 三种语言的解法。每篇文章都有详细的解题步骤、代码注释详细及相关知识点的练习题。有问题,随时解答。

全部评论

相关推荐

09-26 20:36
已编辑
南京航空航天大学 C++
文末有投票!!!!求助!本人23届本科毕业,小公司做了一年c++开发七月份来到现在的国企,技术支持部门💰薪资待遇基本工资9k,转正后还有3k绩效,还有每月400餐补和八百的值班补贴,转正后的话每月能拿到一万一千多,年终5-6个月(去年是6个月年终&nbsp;&nbsp;),一年工会福利2w左右(说工资➕补贴➕福利➕年终肯定超过20w,没纸面承诺)现在试用期只有底薪,到手7千多💻工作情况:应用系统管理员,平时工作不算累,没什么技术含量,无非就是做做运维,写写应急演练计划和测试方案,还有上级单位检查准备材料等,没任何技术含量,也没什么技术提升,有点无聊早八点半晚五,午休一个半小时,工作时间倒是还不错,偶尔加班(比如上面检查)❌缺点:学不到技术,感觉没多大发展前景,原本招我的时候说要组建开发团队,现在看来八字没一撇。乱七八糟的事多,对自身提升不大💡想法:感觉现在这样下去没太大前景,想象不出未来的上升方向,职业规划也不明确。想换公司继续做技术。之前五月份拿了华为od的offer,定级d2薪资13.2+3(每月到手一万三千多,比国企月薪多2k,年包可能跟现在的国企持平,算加班费的话可能会多点),当时没去。现在在考虑找其他公司或者去华为od但是找其他公司,一来经验不算丰富,二来大公司很难进去,去小公司边干边学可行吗 #我的求职思考#&nbsp;&nbsp;#该怎么选#&nbsp;&nbsp;#迷茫#
华为成长空间 398人发布 投递华为等公司10个岗位 我的求职思考
点赞 评论 收藏
分享
2 2 评论
分享
牛客网
牛客企业服务