首页 > 代码库 > 二分练习
二分练习
二分练习
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描写叙述
给你一个序列,然后给你m个元素,让你从序列中找出与每一个元素最接近的数字输出来,假设有两个就输出两个。
输入
多组输入,第一行给你两个数n(0 < n < 10000000),m(0 < m < n),接下来是数列的n个数,然后再输入m个元素,让你找出最接近每一个元素的值。假设有两个,按从小到大输出。
输出
这m个数分别输出最接近每一个元素的值,组与组之间输出一个空行。
演示样例输入
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; }
二分练习
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。