列表

详情


2064. 分配给商店的最多商品的最小值

给你一个整数 n ,表示有 n 间零售商店。总共有 m 种产品,每种产品的数目用一个下标从 0 开始的整数数组 quantities 表示,其中 quantities[i] 表示第 i 种商品的数目。

你需要将 所有商品 分配到零售商店,并遵守这些规则:

请你返回最小的可能的 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 。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int minimizedMaximum(int n, vector<int>& quantities) { } };

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
}

上一题