[P2440] 木材加工 题解

第一次用二分来解题,感触很深。以前只是在猜数中用的二分,现在终于实践了呢。

思路也相当简单,以木材中长度最大者为右端点,以 \(0\) 为左端点。在这个值域内二分来寻找可能的最大值啊喂 kora。

时间复杂度 \(O(n \log k)\)

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 100005;
int n, k, a[maxn], maxx = 0;
bool check(int x) {
	int ans = 0;
	for(int i = 1; i <= n; i ++) ans += a[i] / x;
	return ans >= k;
}
int main() {
	scanf("%d%d", &n, &k);
	for(int i = 1; i <= n; i ++) {
		scanf("%d", &a[i]);
		if(a[i] > maxx) maxx = a[i];
	} int l = 0, r = maxx, mid;
	while(l + 1 < r) {
		mid = l + r >> 1;
		if(check(mid)) l = mid;
		else r = mid;
	} printf("%d", l);
}
posted @ 2021-02-07 17:23  Inversentropir-36  阅读(51)  评论(0编辑  收藏  举报