二分查找
2015-10-16 22:49
204 查看
NOI题库1.11编程基础之二分查找
总时间限制: 1000ms内存限制: 65536kB
题目描述
在一个非降序列中,查找与给定值最接近的元素。
输入第一行包含一个整数n,为非降序列长度。1 <= n <= 100000。
第二行包含n个整数,为非降序列各元素。所有元素的大小均在0-1,000,000,000之间。
第三行包含一个整数m,为要询问的给定值个数。1 <= m <= 10000。
接下来m行,每行一个整数,为要询问最接近元素的给定值。
所有给定值的大小均在0-1,000,000,000之间。
输出m行,每行一个整数,为最接近相应给定值的元素值,保持输入顺序。
若有多个值满足条件,输出最小的一个。
样例输入
3
2 5 8
2
10
5
样例输出
8
5
分析:
一道二分的裸题,好像真的很简单啊,然而交上去莫名的WA五个点,最后才发现是因为没有加绝对值的缘故。。。
好吧,现在来做个简单的分析,对于每一个询问,我对其进行二分,显然,有三种情况:
1、最接近元素就是他自己
2、最接近元素在其左边
3、最接近元素在其右边
注意:在比较最接近元素作差时要加绝对值
下面附上代码:
总时间限制: 1000ms内存限制: 65536kB
题目描述
在一个非降序列中,查找与给定值最接近的元素。
输入第一行包含一个整数n,为非降序列长度。1 <= n <= 100000。
第二行包含n个整数,为非降序列各元素。所有元素的大小均在0-1,000,000,000之间。
第三行包含一个整数m,为要询问的给定值个数。1 <= m <= 10000。
接下来m行,每行一个整数,为要询问最接近元素的给定值。
所有给定值的大小均在0-1,000,000,000之间。
输出m行,每行一个整数,为最接近相应给定值的元素值,保持输入顺序。
若有多个值满足条件,输出最小的一个。
样例输入
3
2 5 8
2
10
5
样例输出
8
5
分析:
一道二分的裸题,好像真的很简单啊,然而交上去莫名的WA五个点,最后才发现是因为没有加绝对值的缘故。。。
好吧,现在来做个简单的分析,对于每一个询问,我对其进行二分,显然,有三种情况:
1、最接近元素就是他自己
2、最接近元素在其左边
3、最接近元素在其右边
注意:在比较最接近元素作差时要加绝对值
下面附上代码:
int num,l,r,i,n,mid,a[100010],m; int getint() { char c = getchar(); int f = 1, k = 0; if(c == '-') f = -1; for(; c < '0' || c > '9'; c = getchar()); for(; c >= '0' && c <= '9'; c = getchar()) k = k * 10 + c - '0'; return k*f; } int main() { n = getint(); for(i = 1; i <= n; i++) { a[i] = getint(); } m = getint(); for(i = 1; i <= m; i++) { int flag = 0; num = getint(); l = 1; r = n + 1; while(r > l+1)//写成左闭右开区间,所以当区间为[l,l+1)时二分结束,故r > l+1 { mid = (l + r) / 2; if(a[mid] > num) r = mid; else if(a[mid] < num) l = mid; else if(a[mid] == num) { flag = 1; cout << num << endl; break; } } if(flag == 0) { if(abs(a[l] - num) < abs(a[r] - num)) { cout << a[l] << endl; } else if(abs(a[l] - num) > abs(a[r] - num)) { if(r == n + 1) r--; cout << a[r] << endl; } else { cout << a[l] << endl; } } } return 0; }
相关文章推荐
- MVC的验证 jquery.validate.unobtrusive
- 疯狂delphi - 朱建强 (一些小例子很实用,也是我所关心的几个问题)
- Kean专题 内容Jig 在绘图界面动态显示坐标
- css less编译工具 gulp-less
- 1688: [Usaco2005 Open]Disease Manangement 疾病管理
- zoj 3228 Searching the String 【AC自动机】
- Test this
- POJ - 2155 Matrix(二维树状数组)
- Task类
- SQL Tuning Health-Check Script (SQLHC)
- Python基本数据结构 习题及源码
- Learning Python
- 关于history.js的使用
- Codeforces Round #326 (div2)
- Error:JDK1.8 Cannot change version of project facet Dynamic Web Module to 3.1.
- swift课程 01 swift 基础
- POJ - 1195 Mobile phones(二维树状数组)
- 可以吧
- 菜鸟之伤--学习总结
- 华为机试