?? 前言
?? 《華為機試真題》專欄含2023年??途W(wǎng)面經(jīng)、華為面經(jīng)試題、華為OD機試真題最新試題。
?? 華為機試有三道題,第一道和第二道屬于簡單題,分值為100分,第三道為困難題,分值為200分,總分400分,150分鐘考試時間。
?? 如果您在準備華為的面試,期間有想了解的可以私信我,我會盡可能幫您解答,也可以給您一些建議!
?? 題目描述
某公司員工食堂以盒飯的方式供餐。
為將員工取餐排隊時間降為0,食堂的供餐速度必須要足夠快。
現(xiàn)在需要根據(jù)以往員工取餐的統(tǒng)計信息,計算出一個剛好能達到排隊時間為0的最低供餐速度;
即,食堂在每個單位時間內必須至少做出多少份盒飯才能滿足要求。
輸入描述:
第一行為一個正整數(shù)N,表示食堂開餐時長;
第二行為一個正整數(shù)M,表示開餐前食堂已經(jīng)準備好的盒飯數(shù)量;
第三行為N個正整數(shù),用空格分割,依次表示開餐時間內按時間順序每個單位時間進入食堂取餐的人數(shù)。
輸出描述:
一個整數(shù),能滿足題目要求的最低供餐速度。(每個單位時間需要做出多少份盒飯)。
?? 解題思路
題目要求根據(jù)員工取餐的統(tǒng)計信息計算能夠達到排隊時間為0的最低供餐速度,即食堂每個單位時間內最少要做出多少份盒飯??梢詤⒖家韵滤悸穼崿F(xiàn):
- 首先,輸入食堂的開餐時長和開餐前準備好的盒飯數(shù)量。
- 然后,按照時間順序輸入每個單位時間內進入食堂取餐的人數(shù)。
- 我們可以使用二分查找來找到能夠達到排隊時間為0的最低供餐速度,即每個單位時間內最少要做出多少份盒飯。
- 對于每個可能的供餐速度,我們可以模擬食堂供餐的過程,計算出每個單位時間結束后排在隊列中的員工數(shù)量。如果排在隊列中的員工數(shù)量等于0,說明該供餐速度能夠達到排隊時間為0。
- 最后,根據(jù)比較結果調整二分查找的上界和下界,直到得到最低供餐速度。
輸入:
3
14
10 4 5
輸出:
3
?? Python代碼實現(xiàn)
# 模擬供餐的過程
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
# 輸入開餐時長和開餐前準備好的盒飯數(shù)量
n = int(input())
m = int(input())
# 輸入每個單位時間內進入食堂取餐的人數(shù)
nums = list(map(int, input().split()))
# 二分查找最低供餐速度
left, right = 1, max(nums)
speed = binary_search(m, nums, left, right)
# 輸出結果
print(speed)
?? Java代碼實現(xiàn)
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語言代碼實現(xiàn)
# 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;
}
文章來源:http://www.zghlxwxcb.cn/news/detail-473055.html
?? 本專欄包含了最新最全的2023年 華為OD機試真題,有詳細的分析和解答。文章來源地址http://www.zghlxwxcb.cn/news/detail-473055.html
到了這里,關于華為OD機試題【食堂供餐】【2023 B卷 100分】的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!