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