第一次用二分来解题,感触很深。以前只是在猜数中用的二分,现在终于实践了呢。
思路也相当简单,以木材中长度最大者为右端点,以 (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);
}