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