二进制搜索答案算法

Binary search the answer algorithm

本文关键字:算法 答案 搜索 二进制      更新时间:2023-10-16

我想帮我解决一个已经被困了两天的算法问题。我知道这个问题可以用二进制搜索答案来解决,但我找不到解决方案。

问题是:没过几天,一条新路就建好了。这条路的左边和右边都是无限长的。道路上的信息亭安装有很多应用,每个车主都有一个在道路上安装其信息亭的首选位置(整数变量a[i]),但道路上的每个信息亭都必须距离之前的位置最多k。每个位置都有多个应用程序(b[i])。问题是找到最需要旅行的售货亭所需的最小距离。输入为n=坐标的数量,k=两个连续信息亭的距离,a[i]=应用程序的坐标,b[i]=申请程序的数量。输出应该是一个双精度的十进制数字,表示旅行次数最多的售货亭的最小距离。a[i]整数是离散的,按升序排序。例如,让我们考虑输入:

3 2

0 1

3 2

6 1

输出:1.00

2 2

0 3

1 1

输出:2.503 1

0 5

2 1

4 5

输出:3.00

提前感谢!

我的想法是最大限度地缩短两个极端信息亭(距离较长的信息亭)从初始位置出发的距离。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<float.h>
#define MAX 10000000
double a[MAX],b[MAX],sum,k;
long long int n;
double min_last=1000000;
int find(double c){
int flag=0;
long long int i;
double pos=c;
// printf("inside fn");
// printf("%lldn",sum);
long long  kiosks=0;
// printf("x=%llfn",c);
if(fabsf((a[0]+pos+k*(sum-1)-a[n-1]))<min_last){
// min_last=fabs((a[0]+c+k*(sum-1)-a[n-1]));
// printf("min_last:%lfn",min_last);
for( i=0;i<sum;i++){
if(pos<=sum+a[n-1]){
kiosks++;
//  printf("%lld %lfn",kiosks,c);
pos=pos+k;
if((kiosks==sum)){
flag=1;
min_last=fabsf((a[0]+c+k*(sum-1)-a[n-1]));
// printf("%lfn",min_last);}
}
}
}
}
// printf("%dn",flag);
return flag;
}
double binarySearch(){
//  printf("inside binaryn");
double low,high,mid;
low=-sum*k-a[n-1];
high=sum*k+a[n-1];
while(low<high){
mid=low+(high-low)/2.0;
if(find(mid)==1){
printf("%lfn",mid);
low=mid;
}
else
high=mid-1;
}
return low;
}
int main(){
long long int i;
double x,start;
double posx;
double low,high,mid;
printf("Give n,k:");
scanf("%lld %lf",&n,&k);
// printf("%lld %lldn",n,k);
printf("Give the arraysn");
sum=0;
// printf("sum=%llfn",sum);
for(i=0;i<n;i++){
//printf("%lldn",i);
scanf("%lf %lf",&a[i],&b[i]);
sum=sum+b[i];
}
printf("%lfn",binarySearch());
//printf("low=%lfn",low);
start=low;
for(i=0;i<sum;i++){
printf("kiosk %lld :%lft",i,start);
start=start+k;}
printf("n");
return 0;
}

您可以选择使用std::equal_rangestd::lower_boundstd::upper_bound。它们是内置的C++二进制搜索函数。