原题
二分
#include<cstdio>
int l,n,m,len;
int a[50005]={0};
int check(int x)//本题的核心
{
int tem=0;
int sum=0;
for(int i=1;i<=n;i++)
{
if(a[i]-tem<x)
sum++;
else
tem=a[i];
}
if(sum>m) return 0;//二分结果较大,二分范围缩小至(l,mid-1)
return 1;//二分结果较小,二分范围缩小至(mid-1,r)
}
int main()
{
int mid;
scanf("%d%d%d", &len, &n, &m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);//防止数据过大在输入上浪费时间
a[n+1]=len;
int l=1,r=len;
while(l<=r)
{
mid =(l+r)/2;
if(check(mid)) l=mid+1;
else r=mid-1;
}
printf("%d",l-1);//答案就是l-1
return 0;
}
本文介绍了一种使用二分查找算法解决特定问题的方法。通过一个具体的示例,展示了如何实现二分查找,并给出了完整的C++代码实现。适用于需要在有序数组中寻找符合条件的最大或最小值的场景。
963

被折叠的 条评论
为什么被折叠?



