【二分】华华给月月准备礼物

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;
}

posted @ 2024-10-05 10:14  peterzh6  阅读(4)  评论(0编辑  收藏  举报