二分法

发布时间:2017-5-27 9:17:11 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"二分法",主要涉及到二分法方面的内容,对于二分法感兴趣的同学可以参考一下。

题目描述 给你一个序列,然后给你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<string.h> #include<stdio.h> #include<ctype.h> #include<algorithm> #include<stack> #include<queue> #include<set> #include<math.h> #include<vector> #include<deque> #include<list> using namespace std; int num[10000521]; int main() { int n,m,i,j,k; int left,right,flag,mid; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n;i++) cin>>num[i]; sort(num,num+n); while(m--) { cin>>k; left=0;right=n-1;flag=0; if(k>=num[n-1]) printf("%d\n",num[n-1]); else if(k<=num[0]) printf("%d\n",num[0]); else { while(left<=right) { mid=(left+right)/2; if(num[mid]==k) flag=1; if(num[mid]>k) right=mid-1; else left=mid+1; } if(flag) printf("%d\n",k); else if(num[left]-k==k-num[right]) printf("%d %d\n",num[right],num[left]); else if(num[left]-k>k-num[right]) printf("%d\n",num[right]); else printf("%d\n",num[left]); } } printf("\n"); } return 0; }

上一篇:黑马程序员—网络编程之UDP
下一篇:最短路--关于对floyd算法的理解

相关文章

关键词: 二分法

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。