思路
- 显然问题的解具有单调性,若长度
能满足要求,则
也能满足要求。
- 因此我们可以使用二分法的方式来代替暴力枚举。可以确定解集的左右边界
,
。
- 我们使用二分搜索来搜索题解的右边界,其中细节不详细展开。
代码实现
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
bool isValid(int mid, int k, vector<int> &arr)
{
int sum = 0;
for (int i = 0; i < arr.size(); i++)
{
sum += arr[i] / mid;
}
return sum >= k;
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, k;
cin >> n >> k;
vector<int> arr(n);
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
int r = *max_element(arr.begin(), arr.end()) + 1;
int l = 1;
while (l < r)
{
int mid = l + (r - l) / 2;
if (isValid(mid, k, arr))
{
l = mid + 1;
}
else
{
r = mid;
}
}
cout << r - 1;
return 0;
}