SDUT-二分练习
来源:互联网 发布:皮带轮怎样数控车编程 编辑:程序博客网 时间:2024/06/05 18:53
二分练习
Time Limit: 1000MS Memory Limit: 65536KB
Problem Description
给你一个序列,然后给你m个元素,让你从序列中找出与每个元素最接近的数字输出来,如果有两个就输出两个。
Input
多组输入,第一行给你两个数n(0 < n < 10000000),m(0 < m < n),接下来是数列的n个数,然后再输入m个元素,让你找出最接近每个元素的值。如果有两个,按从小到大输出。
Output
这m个数分别输出最接近每个元素的值,组与组之间输出一个空行。
Example Input
8 41 2 3 4 5 6 8 114927
Example Output
4826 8
Hint
Author
#include <bits/stdc++.h>using namespace std;int x[10000010];int minimum(int x[],int s,int t,int key)//求下界值{ int i=s,j=t; int reset=-1;//设为-1 while(i<=j)//不断循环至i>j { int mid=(i+j)/2; if(key>=x[mid]) { i=mid+1; reset=mid; } else { j=mid-1; } } return reset;}int maximum(int x[],int s,int t,int key)//求上界值{ int i=s,j=t; int reset=-1; while(i<=j) { int mid=(i+j)/2; if(key>x[mid]) { i=mid+1; } else { j=mid-1; reset=mid; } } return reset;}int main(){ int n,m,i,key; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0; i<n; i++) { scanf("%d",&x[i]); } sort(x,x+n);//调用排序函数 while(m--) { scanf("%d",&key); int mi=minimum(x,0,n-1,key); int ma=maximum(x,0,n-1,key); if(mi==-1)//第一种情况 { printf("%d\n",x[ma]);//注意输出的是数组值,不要输出ma或mi } else if(ma==-1)//第二种情况 { printf("%d\n",x[mi]); } else if(x[ma]==x[mi])//第三种情况 printf("%d\n",x[mi]); else//(数组中没有key的三种情况) { if(key-x[mi]==x[ma]-key)//第四种情况,上下界和key差值一样 { printf("%d %d\n",x[mi],x[ma]); } else if(key-x[mi]>x[ma]-key)//第五种情况 { printf("%d\n",x[ma]); } else//第六种情况 printf("%d\n",x[mi]); } } printf("\n"); } return 0;}
阅读全文
1 0
- SDUT 2781 二分练习
- SDUT-二分练习
- sdut 二分练习
- 二分练习(SDUT 2781)
- SDUT-M--二分查找
- SDUT 2872二分查找
- SDUT第一次打字练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 共用体练习 (sdut oj)
- JIRA6.0.3破解授权详细步骤
- 操作系统复习-1.4 操作系统的体系结构
- VMware虚拟机克隆
- 向量叉乘在永磁同步电机电磁转矩计算中的应用
- 最小生成树MST -- Prim 算法实现
- SDUT-二分练习
- 深入Spring(1)
- 软件公司
- tableview实现下拉刷新
- gps 简介---之一
- JavaScript运行原理解析
- 学习MVC之租房网站(十二)-缓存和静态页面
- 64位Eclipse运行时提示“Failed to load the JNI shared library /Java/jre6/bin/client/jvm.dll”的一个解决方案
- 搜索引擎Sphinx在windows下安装使用