标签:
8 4 1 2 3 4 5 6 8 11 4 9 2 7
4 8 2 6 8
本来学了二分之后感觉会了,但过上一段时间来做这么一道变形题,考虑的还是不够充分。
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> using namespace std; int a[10000001]; int binsrch(int low,int high,int key) { int mid; while(low<=high) { mid=(low+high)/2; if(a[mid]==key) break; else if(key<a[mid]) high=mid-1; else if(key>a[mid]) low=mid+1; } if(a[mid]<=key) return mid; //这两种返回值为都是小于等于目标值key的,比方在 1 2 2 3 中查找3 返回3的位置 else //又如在1 2 2 3 中查找2 返回最右边的2的位置 return mid-1; //还如在 1 2 2 4中查找3 返回最右边的2的位置 } int main() { int i,n,t,m,pos; while(cin>>n>>m) { for(i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n); while(m--) { scanf("%d",&t); pos=binsrch(0,n-1,t); //cout<<pos<<endl; if(t<=a[0]) //考虑两种极端情况,假设目标值小于序列的最小值,输出a[0] {cout<<a[0]<<endl;continue;} if(t>=a[n-1]) {cout<<a[n-1]<<endl;continue;} //同上假设目标值大于序列的最大值,输出a[n-1] if(t==a[pos]) //假设找到了目标值直接输出 cout<<a[pos]<<endl; else //否则的话考虑以下三种情况 { if(t-a[pos]==a[pos+1]-t) //情况1:假设目标值跟a[pos]和a[pos+1]相差的数值一样 输出两个 cout<<a[pos]<<" "<<a[pos+1]<<endl; else if(t-a[pos]<a[pos+1]-t) //情况2:假设目标值跟a[pos]和a[pos+1]相差的数值不一样,输出离得近的那一个 cout<<a[pos]<<endl; else if(t-a[pos]>a[pos+1]-t)//情况3:假设目标值跟a[pos]和a[pos+1]相差的数值不一样,输出离得近的那一个 cout<<a[pos+1]<<endl; } } cout<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/mengfanrong/p/4251152.html