首先对于二分问题,首先要确定,我们要对什么进行二分,二分什么,不难发现我们要对 lll 进行二分,然后确定边界, 左边界为 000, 右边界为 100000001100000001100000001
然后确定好边界后,要解决的问题就是 checkcheckcheck 函数要怎么写, 这里就是看每块木头能切多少段, 直接除 lll 即可
最后判断是否大于等于 kkk 段,是就返回 truetruetrue, 否则返回 falsefalsefalse
#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;
}
该博客主要讨论了一个使用二分查找算法来解决的问题:如何确定将n个原木切成至少k段。首先确定二分搜索的边界,左边界为0,右边界为100000001。接着实现check函数,计算每个木头能切多少段,并判断是否达到或超过k段。如果总段数小于k,则返回false,否则返回true。通过二分查找找到满足条件的最小切割长度。当总长度小于k时,直接输出0。最终输出满足条件的切割长度。





