Solution
看完题目就能想到这个题也许可以二分答案。
但是需要知道这个题目的答案可不可以满足单调性。即对于所有满足条件,则
也满足条件。
很显然这是满足单调性的,如果满足条件,即
那么对于而言,显然有
那么这个题就可以二分答案了。
还有一个点是答案可能会到。于是二分范围直接是区间
即可。
本题check的时候可以加一个小小的剪枝。
不过这个题有一点没有说清楚,即使答案不存在的时候要输出,所以当
的时候也不满足输出
即可。
时间复杂度
Code
#include<bits/stdc++.h>
using namespace std;
int a[200005], n, k;
bool chk(int x) {
int ans = 0;
for(int i = 0; i < n; i++) {
ans += a[i] / x;
if(ans >= k) return true; // 及时退出可以加快速度而且防止爆int
}
return false;
}
int main() {
ios::sync_with_stdio(false), cin.tie(0);
cin >> n >> k;
for(int i = 0; i < n; i++) {
cin >> a[i];
}
int left = 1, right = 1000000000, ans = 0;
// 若答案不存在则应该输出0所以此处ans=0
while(left <= right) {
int mid = (left + right) >> 1;
if(chk(mid)) {
ans = mid;
left = mid + 1;
} else {
right = mid - 1;
}
}
cout << ans << '\n';
} 
京公网安备 11010502036488号