【二分】華華給月月準備禮物

peterzh6發表於2024-10-05

https://ac.nowcoder.com/acm/contest/22353/F

注意點是count += length / mid,在題目中,count += length / mid 的含義是計算每根木棍可以被裁剪成多少段長度為 mid 的木棍。這裡的整除是指 length / mid,它計算的是在給定的木棍長度 length 中,最多可以切出多少段長度為 mid 的完整木棍,不考慮剩餘的部分。
所以不能if(a[i] < mid) count++;或者向上取整

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 檢查給定長度的木棍能否滿足至少 K 根
bool check(const vector<int>& lengths, int mid, int K) {
    long long count = 0;
    for (int length : lengths) {
        count += length / mid;  // 計算每根木棍可以得到多少段
    }
    return count >= K;
}

int main() {
    int N, K;
    cin >> N >> K;
    vector<int> lengths(N);

    for (int i = 0; i < N; ++i) {
        cin >> lengths[i];
    }

    // 二分查詢最大可行長度
    int low = 1, high = *max_element(lengths.begin(), lengths.end());
    int ans = 0;

    while (low <= high) {
        int mid = low + (high - low) / 2;
        if (check(lengths, mid, K)) {
            ans = mid;  // 記錄可行的最大長度
            low = mid + 1;  // 嘗試更大的長度
        } else {
            high = mid - 1;  // 縮小長度範圍
        }
    }

    cout << ans << endl;
    return 0;
}

相關文章