华为OD统一考试 - 爱吃蟠桃的孙悟空
题目描述
孙悟空爱吃蟠桃,有一天趁着蟠桃园守卫不在来偷吃。已知蟠桃园有 N 棵桃树,每颗树上都有桃子,守卫将在 H 小时后回来。
孙悟空可以决定他吃蟠桃的速度K(个/小时),每个小时选一颗桃树,并从树上吃掉 K 个,如果树上的桃子少于 K 个,则全部吃掉,并且这一小时剩余的时间里不再吃桃。
孙悟空喜欢慢慢吃,但又想在守卫回来前吃完桃子。
请返回孙悟空可以在 H 小时内吃掉所有桃子的最小速度 K(K为整数)。如果以任何速度都吃不完所有桃子,则返回0。
输入描述
第一行输入为 N 个数字,N 表示桃树的数量,这 N 个数字表示每颗桃树上蟠桃的数量。
第二行输入为一个数字,表示守卫离开的时间 H。
其中数字通过空格分割,N、H为正整数,每颗树上都有蟠桃,且 0 < N < 10000,0 < H < 10000。
输出描述
吃掉所有蟠桃的最小速度 K,无解或输入异常时输出 0。
用例
输入 | 2 3 4 5 4 |
输出 | 5 |
说明 | 无 |
输入 | 2 3 4 5 3 |
输出 | 0 |
说明 | 无 |
输入 | 30 11 23 4 20 6 |
输出 | 23 |
说明 | 无 |
题目解析
本题可以使用二分法解题。
import Foundation func ODTest_2_1() { print("第一行输入为 N 个数字,N 表示桃树的数量,这 N 个数字表示每颗桃树上蟠桃的数量。") var N = (readLine() ?? "").split(separator: " ").map { Int($0) ?? 0 } print("第二行输入为一个数字,表示守卫离开的时间 H。") print("其中数字通过空格分割,N、H为正整数,每颗树上都有蟠桃,且 0 < N < 10000,0 < H < 10000。") let H = Int(readLine() ?? "") ?? 0 print("吃掉所有蟠桃的最小速度 K") if let _ = N.first(where: { $0 < 1 || $0 > 10000 }) { print("0") return } if H < 1 || H > 10000 { print("0") return } N.sort(by: { $0 < $1 }) let l = 0 let r = N.count var mid = (l + r) / 2 while mid < r && mid > 0 { var k = mid + 1 for i in (mid + 1) ..< r { k += (N[i] / N[mid]) + (N[i] % N[mid] == 0 ? 0 : 1) } if k > H { mid += 1 } else if k < H { mid -= 1 } else { print("\(N[mid])") return } } print("0") }
2024华为OD机试卷题 文章被收录于专栏
本专栏给大家提供了华为2024最新华为OD 题目汇总。华为OD机试刷题记录机考算法题库,帮助你上岸华为。提供C++/Java、JavaScript、Python四种语言的解法。