1 条题解

  • 0
    @ 2025-5-14 20:00:09

    暴力版本

    #include <bits/stdc++.h>
    using namespace std;
    int n, k;
    int L[100000 + 5];
    // 返回能否切出来 k 段长度为 l 的木头
    bool ok(int l)
    {
        long long cnt = 0; // 记录能切出来几段长度为 l 的木头
        for (int i = 1; i <= n; i++)
            cnt += L[i] / l;
        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];
        for (int l = 1;; l++)
        {
            if (!ok(l))
            {
                cout << l - 1;
                return 0;
            }
        }
        return 0;
    }
    

    二分优化

    #include <bits/stdc++.h>
    using namespace std;
    int n, k;
    int L[100000 + 5];
    // 返回能否切出来 k 段长度为 l 的木头
    bool ok(int l)
    {
        long long cnt = 0; // 记录能切出来几段长度为 l 的木头
        for (int i = 1; i <= n; i++)
            cnt += L[i] / l; // 第 i 段原木长度为 L[i],能切出来 L[i]/l 段长度为 l 的木头
        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];
        //可能的答案区间在 1 ~ max(L[i]) 之间
        int l = 1;
        int r = 100'000'000;
        int ans = 0; // 无解时保留 0
        while (l <= r)
        {
            int mid = (l + r) / 2;
            if (ok(mid))
            {
                ans = mid;
                l = mid + 1;
            }
            else
            {
                r = mid - 1;
            }
        }
        cout << ans;
        return 0;
    }
    
    // √√√√√√√√√√√√√×××××
    //        ^
    
    • 1

    信息

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