华为OD机试题【食堂供餐】【2023 B卷 100分】

文章介绍了如何根据员工取餐统计信息,通过二分查找算法确定食堂为了达到零排队时间所需的最低供餐速度。提供了Python、Java和C语言的代码实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述


🎯 前言

🏆 《华为机试真题》专栏含2023年牛客网面经、华为面经试题、华为OD机试真题最新试题。

🏆 华为机试有三道题,第一道和第二道属于简单题,分值为100分,第三道为困难题,分值为200分,总分400分,150分钟考试时间。

🏆 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议!

🎯 题目描述

某公司员工食堂以盒饭的方式供餐。
为将员工取餐排队时间降为0,食堂的供餐速度必须要足够快。
现在需要根据以往员工取餐的统计信息,计算出一个刚好能达到排队时间为0的最低供餐速度;
即,食堂在每个单位时间内必须至少做出多少份盒饭才能满足要求。

输入描述:
第一行为一个正整数N,表示食堂开餐时长;
第二行为一个正整数M,表示开餐前食堂已经准备好的盒饭数量;
第三行为N个正整数,用空格分割,依次表示开餐时间内按时间顺序每个单位时间进入食堂取餐的人数。

输出描述:
一个整数,能满足题目要求的最低供餐速度。(每个单位时间需要做出多少份盒饭)。

🎯 解题思路

题目要求根据员工取餐的统计信息计算能够达到排队时间为0的最低供餐速度,即食堂每个单位时间内最少要做出多少份盒饭。可以参考以下思路实现:

  1. 首先,输入食堂的开餐时长和开餐前准备好的盒饭数量。
  2. 然后,按照时间顺序输入每个单位时间内进入食堂取餐的人数。
  3. 我们可以使用二分查找来找到能够达到排队时间为0的最低供餐速度,即每个单位时间内最少要做出多少份盒饭。
  4. 对于每个可能的供餐速度,我们可以模拟食堂供餐的过程,计算出每个单位时间结束后排在队列中的员工数量。如果排在队列中的员工数量等于0,说明该供餐速度能够达到排队时间为0。
  5. 最后,根据比较结果调整二分查找的上界和下界,直到得到最低供餐速度。

输入:
3
14
10 4 5

输出:
3

📙 Python代码实现

# 模拟供餐的过程
def simulate(m, nums, speed):
    n = len(nums)
    m -= nums[0]
    for i in range(1, n):
        m += speed
        if m >= nums[i]:
            m -= nums[i]
        else:
            return False
    return True


# 二分查找最低供餐速度
def binary_search(m, nums, left, right):
    while left < right:
        mid = (left + right) // 2
        if simulate(m, nums, mid):
            right = mid
        else:
            left = mid + 1
    return left


# 输入开餐时长和开餐前准备好的盒饭数量
n = int(input())
m = int(input())

# 输入每个单位时间内进入食堂取餐的人数
nums = list(map(int, input().split()))

# 二分查找最低供餐速度
left, right = 1, max(nums)
speed = binary_search(m, nums, left, right)

# 输出结果
print(speed)

📗 Java代码实现

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = scanner.nextInt();
        }

        // 二分查找最低供餐速度
        int left = 1, right = Arrays.stream(nums).max().getAsInt() + m;
        while (left < right) {
            int mid = (left + right) / 2;
            if (simulate(m, nums, mid)) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }

        // 输出结果
        System.out.println(left);
    }

    // 模拟供餐的过程
    private static boolean simulate(int m, int[] nums, int speed) {
        int n = nums.length;
        m -= nums[0];
        for (int i = 0; i < n; i++) {
            m += speed;
            if (m >= nums[i]) {
            	m -= nums[i];
            } else {
                return false;
            }
        }
        return true;
    }
}

📘 C语言代码实现

# include
# include

# define MAXN 1000

// 模拟供餐的过程
int simulate(int m, int nums[], int n, int speed) {
    int idx = 0;
    m -= nums[0]
    for (int i = 0; i < n; i++) {
        m += speed;
        if (m >= nums[i]) {
        	m -= nums[i];
        } else {
            return 0;
        }
    }
    return 1;
}

int main() {
    int n, m;
    scanf("%d%d", & n, & m);
    int nums[MAXN];
    for (int i = 0; i < n; i++) {
        scanf("%d", & nums[i]);
    }

    // 二分查找最低供餐速度
    int left = 1, right = nums[0] + m;
    while (left < right) {
        int mid = (left + right) / 2;
        if (simulate(m, nums, n, mid)) {
            right = mid;
        } else {
            left = mid + 1;
        }
    }

    // 输出结果
    printf("%d\n", left);

    return 0;
}

在这里插入图片描述

📭 本专栏包含了最新最全的2023年 华为OD机试真题,有详细的分析和解答。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不太灵光的程序员

有用的话可以请博主喝杯咖啡续命

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值