二分练习
来源:互联网 发布:端口名称怎么查 编辑:程序博客网 时间:2024/06/05 16:24
Think:
很简单的二分查找题, 可用STL解题, 或 普通二分模板
一点要处理好极端条件:
例如key >= a[n - 1] 或 key <= a[ 0 ];的情况
Problem Description
给你一个序列,然后给你m个元素,让你从序列中找出与每个元素最接近的数字输出来,如果有两个就输出两个。
Input
多组输入,第一行给你两个数n(0 < n < 10000000),m(0 < m < n),接下来是数列的n个数,然后再输入m个元素,让你找出最接近每个元素的值。如果有两个,按从小到大输出。
Output
这m个数分别输出最接近每个元素的值,组与组之间输出一个空行。
Example Input
8 4
1 2 3 4 5 6 8 11
4
9
2
7
Example Output
4
8
2
6 8
STL的AC代码:
#include<cstdio>#include<iostream>#include<algorithm>#include<string.h>#include<functional>using namespace std;int a[10000050];int main(){ int n, m; int i; while(~scanf("%d %d", &n, &m)) { for (i = 0; i <= n - 1; i ++) { scanf("%d", &a[i]); } sort(a, a + n); for (i = 0; i <= m - 1; i ++) { int key; scanf("%d", &key); if (key >= a[n - 1]) { printf("%d\n", a[n - 1]); continue; } if (key <= a[0]) { printf("%d\n", a[0]); continue; } if (binary_search(a, a + n , key) == true) printf("%d\n", key); else { int k1 = lower_bound(a, a + n, key) - a; int k2 = upper_bound(a, a + n, key) - a; k1 = a[k1 - 1]; k2 = a[k2]; if (key -k1 == k2 - key) printf("%d %d\n", k1, k2); if (key - k1 > k2 - key) printf("%d\n", k2); if (key - k1 < k2 - key) printf("%d\n", k1); } } printf("\n"); }}
二分模板AC代码
#include<cstdio>#include<string.h>#include<iostream>#include<algorithm>using namespace std;int a[10000050];int Binary_search(int low, int high, int key);int main(){ int n, m; int i; int PW; while(~scanf("%d %d", &n, &m)) { for(i = 0; i <= n - 1; i ++) scanf("%d", &a[i]); sort(a, a + n); for (i = 0; i <= m - 1; i ++) { int key; scanf("%d", &key); if (key >= a[n - 1]) { printf("%d\n", a[n - 1]); continue; } if (key <= a[0]) { printf("%d\n", a[0]); continue; } PW = Binary_search(0, n - 1, key); if(a[PW] == key) printf("%d\n", key); else { if (key - a[PW] == a[PW + 1] - key) printf("%d %d\n", a[PW], a[PW + 1]); if (key - a[PW] < a[PW + 1] - key) printf("%d\n", a[PW]); if (key - a[PW] > a[PW + 1] - key) printf("%d\n", a[PW + 1]); } } printf("\n"); }}int Binary_search(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; else return mid - 1;}
阅读全文
0 0
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- sdut2781 二分练习
- 【2781】二分练习 sdutOJ
- 二分查找代码练习
- 二分练习题解
- SDUT 2781 二分练习
- SDUT-二分练习
- Kotlin练习-二分查找
- Scala练习-二分查找
- angular学习总结二——数据&事件绑定(ngIf、ngFor、ngSwitch、ngModel)
- Java 多catch
- java 16进制字符串 转 byte[] 转文件 文件 转byte[] 转16进制字符串
- VS10打开VS12版本创建的工程
- poj 3261 (后缀数组+二分)
- 二分练习
- C语言中的宏定义
- Ext JS 构造函数、私有变量和静态变量
- js的常用功能及属性总结
- Andrew Ng机器学习课程笔记--week9(上)
- golang net包基础解析
- hdu-1370(中国剩余定理余数互质)&&hdu-1573(中国剩余定理余数不互质)
- tensorflow学习——GAN手写体生成
- 高效的枚举元素集合