P2440 木材加工题解

题目传送门
无脑的二分答案模板,锻炼写一下check函数吧。
同时有一点需要注意,就是(l)的初始值不能是0!,否则第四个测试点RE掉!

#include <bits/stdc++.h>

typedef long long LL;
using namespace std;
const int N = 1000010;
int a[N];
int n;
LL k;

bool check(LL mid) {
  LL res = 0;
  for (int i = 1; i <= n; i++) res += a[i] / mid;
  return res >= k;
}

int main() {
  cin >> n >> k;
  for (int i = 1; i <= n; i++) cin >> a[i];
  sort(a + 1, a + n + 1);
  // mid的定义:能够切割得到的小段的***最大长度***
  LL l = 1, r = a[n], ans = 0;
  //注意l要从1开始,从0开始会有4点RE
  //二分答案模板
  while (l <= r) {
    int mid = (l + r) >> 1;
    if (check(mid))
      l = (ans = mid) + 1;  //在右区间查找,同时更新答案
    else
      r = mid - 1;  //在左区间查找
  }
  //输出
  cout << ans << endl;
  return 0;
}
原文地址:https://www.cnblogs.com/littlehb/p/15057225.html