1 条题解

  • 0
    @ 2023-8-29 16:13:20
    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 100000;
    int n, k;
    int L[MAXN + 5];
    // 返回能否切出来 k 段长度为 len 的木头
    bool check(int len)
    {
        long long cnt = 0; // 统计能切出多少段
        for (int i = 1; i <= n; i++)
            cnt += L[i] / len;
        return cnt >= k;
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n >> k;
        for (int i = 1; i <= n; i++)
            cin >> L[i];
        // 计算原木的最大长度及长度之和
        int maxL;
        long long sumL;
        maxL = sumL = L[1];
        for (int i = 2; i <= n; i++)
        {
            maxL = max(maxL, L[i]);
            sumL += L[i];
        }
        // 特殊情况,切不出来 m 段长度为 1 的
        if (sumL < k)
        {
            cout << 0;
            return 0;
        }
        // 做法 1:枚举答案(超时)
        for (int i = 1; i <= maxL; i++)
            if (!check(i))
            {
                cout << i - 1 << "\n";
                return 0;
            }
        // 做法 2:二分答案(满分)
        int l = 1;
        int r = maxL;
        int ans = 0;
        while (l <= r)
        {
            int mid = (l + r) / 2;
            if (check(mid))
            {
                ans = mid;
                l = mid + 1;
            }
            else
                r = mid - 1;
        }
        cout << ans << "\n";
        return 0;
    }
    
    • 1

    信息

    ID
    1315
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    11
    已通过
    6
    上传者