【二分】华华给月月准备礼物
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;
}