首先分析能不能用二分.
二分的条件:满足单调性和check答案比较简单.
单调性:可以二分长度, 显然是满足单调性的.
check:
1.每次二分木棍的长度mid, 然后对每个a[i] 都能得到 a[i] / mid 个需要的木棍.
2.我们check一下能不能得到超过k个所需木棍.
3.直接统计满足条件的最大长度即可.
注意:最后的答案可能为0.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
const double PI = acos(-1.0);
const double eps = 1e-10;
const ll inf = 1e18;
int main(int argc, char const *argv[])
{
ll n, k;
cin >> n >> k;
for (int i = 0; i < n; ++i)
{
cin >> a[i];
}
ll ans = 0;
ll left = 1;
ll right = 1e9;
while(left <= right)
{
int m = left + (right - left) / 2;
ll cnt = 0;
for (int i = 0; i < n; ++i)
{
cnt += a[i] / m;
}
if (cnt >= k)
{
ans = m;
left = m + 1;
}
else
{
right = m - 1;
}
}
cout << ans << endl;
return 0;
}