传送门

题意

更定n段长度为的木棍,问若把他们分成k个相同长度的,最大长度是多少

tags

  • 二分

    分析

    可以对长度进行二分。二分下届为1,上界为max(a[i])。
    用贪心的方法经行检查。每个对于答案的贡献是。所以若说明mid的取值大了可以减少,否则需要增大
    check函数复杂度:,总复杂度:

    参考代码

#include <bits/stdc++.h>
using namespace std;
#define FAST_IO ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
typedef long long ll;
typedef unsigned int UINT;
typedef unsigned long long ull;
typedef pair<int, int> pdi;
typedef pair<ll, int> pli;

int const maxn = 2e5 + 10;

int n, k;
int a[maxn];

bool check(int mid) {
    ll sum = 0;
    for (int i = 1; i <= n; i++) {
        sum += a[i] / mid;
    }
    return sum >= k;
}
int main(void) {
    FAST_IO;

    cin >> n >> k;
    int l = 1, r = 0;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        r = max(a[i], r);
    }
    ll ans = 0;
    while (l <= r) {
        int mid = l + r >> 1;
        if (check(mid)) {
            l = mid + 1;
            ans = mid;
        } else {
            r = mid - 1;
        }
    }
    cout << ans << endl;

    return 0;
}