class Solution {
public:
int minimizedMaximum(int n, vector<int>& quantities) {
}
};
2064. 分配给商店的最多商品的最小值
给你一个整数 n
,表示有 n
间零售商店。总共有 m
种产品,每种产品的数目用一个下标从 0 开始的整数数组 quantities
表示,其中 quantities[i]
表示第 i
种商品的数目。
你需要将 所有商品 分配到零售商店,并遵守这些规则:
0
件)。用 x
表示所有商店中分配商品数目的最大值,你希望 x
越小越好。也就是说,你想 最小化 分配给任意商店商品数目的 最大值 。请你返回最小的可能的 x
。
示例 1:
输入:n = 6, quantities = [11,6] 输出:3 解释: 一种最优方案为: - 11 件种类为 0 的商品被分配到前 4 间商店,分配数目分别为:2,3,3,3 。 - 6 件种类为 1 的商品被分配到另外 2 间商店,分配数目分别为:3,3 。 分配给所有商店的最大商品数目为 max(2, 3, 3, 3, 3, 3) = 3 。
示例 2:
输入:n = 7, quantities = [15,10,10] 输出:5 解释:一种最优方案为: - 15 件种类为 0 的商品被分配到前 3 间商店,分配数目为:5,5,5 。 - 10 件种类为 1 的商品被分配到接下来 2 间商店,数目为:5,5 。 - 10 件种类为 2 的商品被分配到最后 2 间商店,数目为:5,5 。 分配给所有商店的最大商品数目为 max(5, 5, 5, 5, 5, 5, 5) = 5 。
示例 3:
输入:n = 1, quantities = [100000] 输出:100000 解释:唯一一种最优方案为: - 所有 100000 件商品 0 都分配到唯一的商店中。 分配给所有商店的最大商品数目为 max(100000) = 100000 。
提示:
m == quantities.length
1 <= m <= n <= 105
1 <= quantities[i] <= 105
原站题解
rust 解法, 执行用时: 36 ms, 内存消耗: 3.2 MB, 提交时间: 2023-09-14 00:55:34
impl Solution { pub fn minimized_maximum(n: i32, quantities: Vec<i32>) -> i32 { let mut left = 1; let mut right = *quantities.iter().max().unwrap(); while left < right { let mid = (left + right ) / 2; let cnt = quantities.iter().fold(0, |acc, x| { acc + (x + mid - 1) / mid }); if cnt <= n { right = mid; } else { left = mid + 1 ; } } left } }
python3 解法, 执行用时: 880 ms, 内存消耗: 27.7 MB, 提交时间: 2023-09-14 00:55:06
class Solution: def minimizedMaximum(self, n: int, quantities: List[int]) -> int: left, right = 1,100000 while left < right: mid = (left + right) // 2 if sum([math.ceil(q / mid) for q in quantities]) <= n: right = mid else: left = mid + 1 return left
python3 解法, 执行用时: 1732 ms, 内存消耗: 28.5 MB, 提交时间: 2023-09-14 00:54:36
class Solution: def minimizedMaximum(self, n: int, quantities: List[int]) -> int: def check(a: int) -> bool: remain = n for q in quantities: remain -= math.ceil(q/a) if remain < 0: return False return True idx = bisect.bisect_left([i for i in range(1, 100000)], 1, key=check) return idx + 1
java 解法, 执行用时: 23 ms, 内存消耗: 55.2 MB, 提交时间: 2023-09-14 00:51:44
public class Solution { public int minimizedMaximum(int n, int[] quantities) { int max = 0; for (int q : quantities) max = Math.max(max, q); int left = 1, right = max; while (left < right) { int mid = left + (right - left) / 2; if (check(quantities, n, mid)) right = mid; else left = mid + 1; } return left; } private boolean check(int[] quantities, int n, int k) { int count = 0; for (int q : quantities) count += (q + k - 1) / k; return count <= n; } }
golang 解法, 执行用时: 132 ms, 内存消耗: 8.9 MB, 提交时间: 2023-09-14 00:51:09
func minimizedMaximum(n int, quantities []int) int { return sort.Search(1e5, func(max int) bool { cnt := 0 for _, q := range quantities { cnt += (q + max) / (max + 1) } return cnt <= n }) + 1 }