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