LCP 12. 小张刷题计划

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
class Solution {
public int minTime(int[] time, int m) {
int sum = 0;
for (int t : time) {
sum += t;
}

// 搜索最小的 T
int left = 0, right = sum; // [left, right]
while (left < right) {
int mid = (left + right) >>> 1;
if (canFinish(time, mid, m)) {
right = mid;
} else {
left = mid + 1;
}
}

return left;
}

private boolean canFinish(int[] time, int t, int maxDays) {
int subMax = 0, subSum = 0, subDays = 1;

for (int num : time) {
int secondMax = Math.min(subMax, num); // 第二大的耗时
if (subSum + secondMax <= t) { // 每天删除最大值后小于等于 t
subSum += secondMax;
subMax = Math.max(subMax, num);
} else { // 新的一天
subSum = 0; // 默认将当天删除,所以此处为 0
subDays++;
subMax = num;
}
}

return subDays <= maxDays;
}
}

References

LCP 12. 小张刷题计划