NOI的1.1的01:查找最接近的元素代码错了不知道怎么修改
原题在http://noi.openjudge.cn/ch0111/01/
二分查找函数怎么写啊,怎么才能得到最接近元素的下标
#include
#include
using namespace std;
int bi_search(int n,int a[],int t){
int left=0,right=t,res=-1,mid,min=0;
if(a[t]<=n) res=t;
else if(a[0]>=n) res=0;
else {
while(left<=right){
mid=(right+left)/2;
if(a[mid]==n) {res=mid;break;}
else if(a[mid]>n) right=mid-1;
else left=mid+1;
}
res=mid;
}
return res;
}
int main(){
int n,i,l,a[100010],m,b[100010],t,e;
cin>>n;
for(i=0;i<n;i++) cin>>a[i];
t=i-1;
cin>>m;
for(i=0;i>b[i];
for(i=0;it);
cout<
代码中n是数组长度,t是需要查找的数,你的bi_search函数中逻辑错了。
平台测试已通过:
代码修改如下:
#include <iostream>
#include <math.h>
using namespace std;
//非降序数列二分法查找
int bi_search(int n, int a[], int t) {
int mid, left, right;
if (t <= a[0]) return a[0];
else if (t >= a[n - 1]) return a[n-1];
left = 0;
right = n - 1;
mid = n / 2;
while (1)
{
if (a[mid] == t) return a[mid];
if (a[mid - 1] == t) return a[mid - 1];
if (a[mid - 1] < t && t < a[mid])
{
if ((a[mid] - t) < (t - a[mid - 1]))
return a[mid];
else
return a[mid - 1];
}
else
{
if (t < a[mid - 1])
{
left = left;
right = mid - 1;
}
else
{
left = mid;
right = right;
}
mid = left + (right - left + 1) / 2;
}
}
}
int main() {
int n, i, a[100010], m, b[10002],e;
cin >> n;
for (i = 0; i < n; i++)
cin >> a[i];
cin >> m;
for (i = 0; i < m; i++)
cin >> b[i];
for (i = 0; i < m; i++) {
e = bi_search(n, a, b[i]);
cout << e << endl;
}
return 0;
}
你这是找相同的数的二分法,但题目是找最接近的。因此需要在比较的过程中,记录搜索值与比较过的值的差值,找出差最小的
#include<iostream>
#include<math.h>
using namespace std;
int bi_search(int n,int a[],int t){
int left=0,right=t,res=left,dif = abs(t-a[left]),mid,min=0;
if(a[t]<=n) res=t;
else if(a[0]>=n) res=0;
else
{
while(left<=right)
{
mid=(right+left)/2;
if(a[mid]==n)
{
res=mid;
dif =0;
break;
}
else
{
if(abs(a[mid] - a[res]) < dif)
{
dif = abs(a[mid] - a[res]);
res = mid;
}
else if(abs(a[mid]-a[res]) == dif)
{
if(mid < res)
res = mid;
}
if(a[mid]>n)
right=mid-1;
else
left=mid+1;
}
}
}
return res;
}
int main(){
int n,i,l,a[100010],m,b[100010],t,e;
cin>>n;
for(i=0;i<n;i++) cin>>a[i];
t=i-1;
cin>>m;
for(i=0;i<m;i++) cin>>b[i];
for(i=0;i<m;i++){
e=bi_search(b[i],a,t);
cout<<a[e]<<endl;
}
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!