Loading...

【二分法】在 D 天内送达包裹的能力

在这里插入图片描述 在这里插入图片描述

求解代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public int shipWithinDays(int[] weights, int days) {
            int left = 0;
            int sum = 0;
            for (int weight : weights) {
                left = Math.max(left, weight);
                sum += weight;
            }
            int right = sum;

            while (left < right) {
                int mid = left + ((right - left) >> 1);

                if (f(weights, mid) <= days) {
                    // 满足天数要求:尝试更小的运载能力,收缩右边界
                    right = mid;
                } else {
                    // 不满足要求:必须增大运载能力,收缩左边界
                    left = mid + 1;
                }
            }
            return left;
        }

        private int f(int[] weights, int capacity) {
            int days = 0;
            for (int i = 0; i < weights.length;) {
                int cap = capacity;
                while (i < weights.length) {
                    // 装不下当前包裹,结束本批次运输
                    if (cap < weights[i]) {
                        break;
                    } else {
                        cap -= weights[i];
                    }
                    i++;
                }
                // 完成一趟运输,天数+1
                days++;
            }
            return days;
        }
最后更新于 2026-04-05 17:35:33
Code Road Record