lc1001

熟悉一下做题。。应该不难的题但现在真没做题的感觉。

原题

传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。

传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。

返回能在 D 天内将传送带上的所有包裹送达的船的最低运载能力。

思路

船最小运载量:最重的那个货物;最大的运载量:所有货物之和。

直接遍历较慢,通过二分查找找到那个满足的最左边界值。

二分查找

int lo, hi, tar;
while (lo < hi) {
  int mid = (lo + hi) / 2;
  if (f(mid) == tar) {
    break;
  }
  if (f(mid) > tar) {
    hi = mid - 1;
  } else {
    lo = mid + 1;
  }
}
//f()为正序单调函数,该题中为mid值是否能运载成功的判断函数

Leopord
0 声望0 粉丝