另一篇二分查找之求最大值的最小值
题目链接:点击这里
看到题目中的“使得距离最近的2个距离最大”,就知道这题考察的是用二分法求满足条件的最大值
所以关于"mid"的求法如下:
while(l<r)
{
mid = (l+r+1)/2;//注意是(l+r+1)
if(judge(mid))//满足条件
{
l = mid;
}
else
r = mid -1;
}
其中的
mid = (l+r+1)/2;
若要防止溢出可改为
mid = l+(r-l+1)/2;
详情请见大佬博客
关于"L"和"R"的选取
距离最近的最小的一种情况就是0,最大的情况就是输入的坐标的最大值
然后是"judge"函数的编写
判断相邻两个瓶盖间的距离是否大于等于传入的"mid",满足就找到了一个,不满足接着往后找,最后的数量大于设定的数量说明可以,否则不行。
放上全部源码:
#include "stdio.h"
#include <algorithm>
using namespace std;
#define Max 100001
int A,B,a[Max];
bool judge(int x)
{
int i,num=1,now=1;
for(i = 2;i <= A;i++)
{
if(a[i]-a[now] >= x)
{
num++;
now = i;
}
}
return num>=B;
}
int main()
{
scanf("%d%d",&A,&B);
int i;
for(i = 1;i <= A;i++)
scanf("%d",&a[i]);
sort(a+1,a+A+1);
int l = 0,r = a[A];
int mid;
while(l<r)
{
mid = (l+r+1)/2;
if(judge(mid))
{
l = mid;
}
else
r = mid -1;
}
printf("%d",l);
return 0;
}