abc174E 最小化不超过k次操作后木棍的最大长度

31 阅读1分钟

题面:有n根木棍,第i根木棍长度为a[i],每次操作可以选一根木棍将其锯成两段,要求总操作次数不超过k。问最终所有木棍最大长度的最小值是多少?

范围:1 <= n <= 2E5; 0 <= k <= 1E9; 1 <= a[i] <= 1E9

分析:最小化最大值,或者反过来最大化最小值,优先考虑二分答案,对于某个特定的长度x,考虑将其锯成最长x一段需要的次数,如果总次数不超过k,那x就在可行域里。

#include <bits/stdc++.h>
using i64 = long long;
const int N = 200005;
i64 k, n, A[N];
int check(i64 x) {
    i64 cnt = 0;
    for (int i = 1; i <= n; i++) {
        if (A[i] % x == 0)
            cnt += A[i] / x - 1;
        else
            cnt += A[i] / x;
    }
    return cnt <= k;
}
void solve() {
    std::cin >> n >> k;
    for (int i = 1; i <= n; i++) {
        std::cin >> A[i];
    }
    i64 lo = 0, hi = 1E10, mid;
    while (lo + 1 < hi) {
        mid = (lo + hi) / 2;
        if (check(mid))
            hi = mid;
        else
            lo = mid;
    }
    std::cout << hi << "\n";
}
int main() {
    std::cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

标签:二分