首先对于二分问题,首先要确定,我们要对什么进行二分,二分什么,不难发现我们要对 l l l 进行二分,然后确定边界, 左边界为 0 0 0, 右边界为 100000001 100000001 100000001
然后确定好边界后,要解决的问题就是
c
h
e
c
k
check
check 函数要怎么写, 这里就是看每块木头能切多少段, 直接除
l
l
l 即可
最后判断是否大于等于
k
k
k 段,是就返回
t
r
u
e
true
true, 否则返回
f
a
l
s
e
false
false
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100010];
ll n, k, l = 1, r = 100000001, mid, sum = 0;
bool check(ll mid) //n个原木 k段 长度mid
{
ll num = 0;
for (int i = 1; i <= n; i++)
num += a[i] / mid; //能切多少段
if (num < k) //判断
return false;
else return true;
}
int main()
{
scanf("%d %d", & n, & k);
for (int i = 1; i <= n; i++)
scanf("%lld", & a[i]);
for (int i = 1; i <= n; i++)
sum += a[i];
if (sum < k) //总和都不够, 直接输出0
{
printf("0");
return 0;
}
while (l < r) //二分
{
mid = (l + r) / 2;
if (!check(mid)) r = mid;
else l = mid + 1;
}
cout << l - 1<< '\n';
return 0;
}