[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);
}
原文地址:https://www.cnblogs.com/Inversentropir-36/p/14385977.html