算法之二分查找

来源:互联网 发布:linux hexdump函数 编辑:程序博客网 时间:2024/05/16 08:02

01:查找最接近的元素

  • 查看
  • 提交
  • 统计
  • 提问
总时间限制: 
1000ms 
内存限制: 
65536kB
描述

在一个非降序列中,查找与给定值最接近的元素。

输入
第一行包含一个整数n,为非降序列长度。1 <= n <= 100000。第二行包含n个整数,为非降序列各元素。所有元素的大小均在0-1,000,000,000之间。第三行包含一个整数m,为要询问的给定值个数。1 <= m <= 10000。接下来m行,每行一个整数,为要询问最接近元素的给定值。所有给定值的大小均在0-1,000,000,000之间。
输出
m行,每行一个整数,为最接近相应给定值的元素值,保持输入顺序。若有多个值满足条件,输出最小的一个。
样例输入
32 5 82105
样例输出
85

//二分查找函数版本1 /*写一个函数,在包含size个元素的,从小到大排序的int数组a中查找元素p,如果找到,返回元素下标,如果找不到,则返回-1,要求复杂O(log(n))*/ int BinarySearch(int a[],int size,int p){int L=0,R=size-1;while(l<=R){int mid=L+(R-L)/2;if(p==a[mid])return mid;else if(p<a[mid]){R=mid-1;}else if(p>a[mid]){L=mid+1;}}return -1;} //复杂度o(log(n)) //////////////////////////////////////二分查找函数版本2/*写一个函数LowerBound,在包含size个元素的,从小到大排序的int数组a里查找比给定整数p小的,下标最大的元素,找到返回其下标,找不到返回-1*/int LowerBound(int a[],int size,int p){//复杂度O(log(n)) int L=0,R=size-1;int lastPos=-1;//到目前为止找到的最优解 while(L<=R){//如果查找区间不为空就继续查找 int mid=L+(R-L)/2;if(p<=a[mid]){R=mid-1;}else{lastPos=mid;L=mid+1;}}return lastpos;} 
#include <bits/stdc++.h>using namespace std;#define MAXN (100100) int num[MAXN];int main(){   int n;   cin>>n;   for(int i=1;i<=n;++i)   cin>>num[i];   int m;   cin>>m;   while(m--){   int x,ans;   cin>>x;   int l=1,r=n,mid;   if(x<=num[1]){   cout<<num[1]<<endl;   continue;   }   if(x>=num[n]){   cout<<num[n]<<endl;   continue;   }   while(l<=r){   mid=(l+r)>>1;   if(num[mid]<=x){   l=mid+1;   }   else r=mid-1;      }if(abs(num[l]-x)<abs(num[r]-x))        ans=l;else ans =r;cout<<num[ans]<<endl;       }return 0;}
原创粉丝点击