二分练习
来源:互联网 发布:电商网站php 编辑:程序博客网 时间:2024/06/01 09:10
二分练习
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
给你一个序列,然后给你m个元素,让你从序列中找出与每个元素最接近的数字输出来,如果有两个就输出两个。
输入
多组输入,第一行给你两个数n(0 < n < 10000000),m(0 < m < n),接下来是数列的n个数,然后再输入m个元素,让你找出最接近每个元素的值。如果有两个,按从小到大输出。
输出
这m个数分别输出最接近每个元素的值,组与组之间输出一个空行。
示例输入
8 41 2 3 4 5 6 8 114927
示例输出
4826 8
提示
来源
lwn
示例程序
#include <stdio.h> #include <string.h> int a[10000000]; void Qsort(int r[],int s,int t) { int low=s,high=t,mid; int key=r[low]; if (low<high) { while (low<high) { while (low<high&&r[high]>=key) high--; r[low]=r[high]; while (low<high&&r[low]<=key) low++; r[high]=r[low]; } r[low]=key; mid=low; Qsort(r,s,mid-1); Qsort(r,mid+1,t); } } int main() { int n,m,x,i; while (scanf("%d%d",&n,&m)!=EOF) { for (i=0;i<n;i++) scanf("%d",&a[i]); Qsort(a,0,n-1); while (m--) { scanf("%d",&x); if (x<a[0]) printf("%d\n",a[0]); else if (x>a[n-1]) printf("%d\n",a[n-1]); else { int low=0,high=n-1,mid; while (low<=high) { mid=(low+high)/2; if (x<a[mid]) high=mid-1; else if (x>a[mid]) low=mid+1; else if (x==a[mid]) { printf("%d\n",x); break; } } if (low>high) { if (x-a[high]<a[low]-x) printf("%d\n",a[high]); else if (a[low]-x<x-a[high]) printf("%d\n",a[low]); else printf("%d %d\n",a[high],a[low]); } } } printf("\n"); } return 0; }
0 0
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- sdut2781 二分练习
- 【2781】二分练习 sdutOJ
- 二分查找代码练习
- 二分练习题解
- SDUT 2781 二分练习
- SDUT-二分练习
- Kotlin练习-二分查找
- Scala练习-二分查找
- php入门基础 二
- 内核阅读之浅析Linux2.6.34内核路由数据转发(二)
- 最短路径
- 【Leetcode】Set Matrix Zeroes
- Hadoop中数据序列化的常用方式:SequenceFile, Avro, Thrift, ProtoBuff -- 待完善
- 二分练习
- 电影节
- 小鑫的城堡
- Android监听耳机按键事件
- BZOJ 1087 (状态压缩DP)
- php 入门基础 三
- 数据结构之链表
- linux 下sort 命令排序
- Avro技术应用_5. 利用 Camus 来将 Avro 数据从 Kafka 拷贝到 HDFS -- 待完善