一、题目大意
题目传送门
查找最接近的元素(分治法/二分查找):在一个非降序列中,查找与给定值最接近的元素。

[输入]

第一行包含一个整数n,为非降序列长度。

第二行包含n个整数,为非降序列各元素。

第三行包含一个整数m,为要询问的给定值个数。1 <= m <= 10000。

接下来m行,每行一个整数,为要询问最接近元素的给定值。所有给定值的大小均在0-1,000,000,000之间

[输出]

m行,每行一个整数,为最接近相应给定值的元素值,保持输入顺序。若有多个值满足条件,输出最小的一个

input:32 5 82105output:85

思路如下:

这一题就是用二分法求最接近所给m在 a[] 数组中的值,由于是最接近,我们需要对情况进行更细致的讨论,这里我会的有两种方式解这一题:
第一种是用递归的方式来写二分(但是注意这种方法在这一题是行不通的因为数据太大,递归层数太多,造成栈溢出,但是分类讨论的思想还是值的我们学习的);另外一种就是用while循环的方法写二分

递归题解

/*二分递归找最近的值的步骤:主要思想是:在不断细分区间的时候,通过不同的判断条件,去不断的选择符合题意的区间,当选择了某一个区间后,并对该区间进行分类讨论:讨论1.看min与边界的差值是否为1,如果是1,那么我们想要的结果就是在ar[mid]与ar[边界值]之间选择(通过看值两个数与所要找的数的差值,进行比较,还要注意两者均是可以选择的)1.讨论要查找的值是否在所求区间的外边(那么最接近要查找的值就是边界值,所以接下来要对边界值进行讨论)
2.讨论 要查找的值位于做边界值与ar[mid] 之间
3.讨论 要查找的值位于ar[mid]与右边界值之间
4.讨论 要查找的值等与ar[mid]的情况
*/
#include<stdio.h>
#include<stdlib.h>
int a[10005];//存放升序排列的一列数字
int b[10005];//存放要找的数字
int m;//输入要查找的数的个数
long long finder(int mx, int mn, int mid, int j)//
{//第一步区分查找的这个数是否在开区间内if (b[j] <= a[mn] || b[j] >= a[mx])//不在{//对内部进行细分,到底是比最小的还小,还是比最大的还大if (b[j] <= a[mn])  //比最小的还小printf("%d\n", a[mn]);else//比最大的还大printf("%d\n", a[mx]);}else//位于最小的数字和最大的数字之间{//根据mid来分,比mid大还是比mid小,还是和mid相等if (a[mn]<b[j] && b[j]<a[mid])//比mid小{if (mid - mn != 1){mx = mid - 1;//将mx替换为midmid = (mn + mx) / 2;//重新计算mid下标finder(mx, mn, mid, j);}else{if (a[mid] - b[j]>b[j] - a[mn])//比较距离printf("%d\n", a[mn]);else if (a[mid] - b[j]<b[j] - a[mn])printf("%d\n", a[mid]);elseprintf("%d %d\n", a[mn], a[mid]);}}else if (a[mid]<b[j] && b[j]<a[mx])//比mid大{if (mx - mid != 1){mn = mid;//重新计算mnmid = (mn + mx) / 2;//重新计算mid下标finder(mx, mn, mid, j);}else{if (b[j] - a[mid]>a[mx] - b[j])printf("%d\n", a[mx]);else if (b[j] - a[mid]<a[mx] - b[j])printf("%d\n", a[mid]);elseprintf("%d %d\n", a[mid], a[mx]);}}else//和mid相等printf("%d\n", b[j]);}return 0;
}
int main()
{int j = 0;//用作函数循环的int n;//输入非降序序列的长度scanf("%d", &n);for (int i = 0; i<n; i++) //循环输入n个数字scanf("%d", &a[i]);scanf("%d", &m);    //输入要查询的数字个数for (int i = 0; i<m; i++) //循环输入要查找的数,存在b[i]中scanf("%d", &b[i]);int mx = n - 1, mn = 0;int mid = (mx + mn) / 2;for (j = 0; j<m; j++)//循环调用函数,把b[j]中存储的所有要找的数字找完finder(mx, mn, mid, j);return 0;}

whille循环题解

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
long long a[100001];
int n;
long long Binary_search(long long int b)
{//首先对是否在该区间以外进行讨论int l = 0;int r = n - 1;if(b <= a[l])return a[l];if(b >= a[r])return a[r];//在所求区间内进行二分讨论while(r - l > 1)        //while循环里面的r - l > 1 这个限定条件很重要,当r yu l 的差值为1 的时候就应该停止循环了,在分别ar[l] 与 ar[r] 两个值讨论看那个值更合适{int mid = (l + r) / 2;if(b >= a[mid])l = mid;      //在这里 l 直接等于 mid ,否则会出错elser = mid;     // 同理}long long int x = abs(a[l] - b);long long int y = abs(a[r] - b);return x <= y ? a[l] : a[r];
}int main()
{//    freopen("T.txt","r",stdin);int i,m;long long b;scanf("%d",&n);for(i=0;i<n;i++){scanf("%lld",&a[i]);}scanf("%d",&m);while(m){scanf("%lld",&b);printf("%lld\n",Binary_search(b));m--;}return 0;
}

查找最接近的元素(二分法)相关推荐

  1. C语言(CED)查找最接近的元素(分治法/二分查找):在一个非降序列中,查找与给定值最接近的元素。(递归实现)

    (请先看置顶博文)https://blog.csdn.net/GenuineMonster/article/details/104495419 一.题目大意 查找最接近的元素(分治法/二分查找):在一 ...

  2. 信息学奥赛一本通(1240:查找最接近的元素)

    1240:查找最接近的元素 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 11822     通过数: 3950 [题目描述] 在一个非降序列中,查找与给定值最接 ...

  3. Bailian4134 查找最接近的元素【二分查找】

    4134:查找最接近的元素 总时间限制: 1000ms 内存限制: 65536kB 描述 在一个非降序列中,查找与给定值最接近的元素. 输入 第一行包含一个整数n,为非降序列长度.1 <= n ...

  4. 1.11 查找最接近的元素

    01:查找最接近的元素 描述 在一个非降序列中,查找与给定值最接近的元素. 输入 第一行包含一个整数n,为非降序列长度.1 <= n <= 100000. 第二行包含n个整数,为非降序列各 ...

  5. 查找最接近的元素(信息学奥赛一本通-T1240)

    [题目描述] 在一个非降序列中,查找与给定值最接近的元素. [输入] 第一行包含一个整数n,为非降序列长度.1 ≤ n ≤ 100000. 第二行包含n个整数,为非降序列各元素.所有元素的大小均在0- ...

  6. 14、查找最接近的元素

    在一个非降序列中,查找与蒜头君的给定值最接近的元素. 输入格式 第一行包含一个整数 n,为非降序列长度.1≤n≤100000. 第二行包含 n个整数,为非降序列各元素.所有元素的大小均在 0∼1,00 ...

  7. 查找最接近的元素(c语言)

    题目描述 在一个非降序列中,查找与给定值最接近的元素. 输入 第一行包含一个整数n,为非降序列长度.1 <= n <= 100000. 第二行包含n个整数,为非降序列各元素.所有元素的大小 ...

  8. 查找最接近的元素c语言,查找最接近的元素

    这是到挺有意思的题,做为饭后消食还是不错的选择 首先题目说不降序列也就是说序列是有序的呢就好办了,直接二分 分析易知,和一个数\(x\)最接近的数只有三种情况 大于\(x\)的数中最小的 小于\(x\ ...

  9. LeetCode题解:找到 K 个最接近的元素

    模版III - 找到 K 个最接近的元素(middle) 一.题目 LeetCode658.找到 K 个最接近的元素 给定一个排序好的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两 ...

最新文章

  1. AI:2020年6月16日晚20点陆奇博士演讲《正视挑战把握创业创新机会》
  2. python3 for循环怎么用_Python3入门系列之-----循环语句(for/while)
  3. [LeetCode]238.Product of Array Except Self
  4. matlab 度表示,在matlab中,单精度类型用关键字()表示,双精度类型用关键字()表示...
  5. java的多线程机制(文字描述区别)
  6. 《支付宝的高可用与容灾架构演进》读后感
  7. 使用axis2 services.xml 发布web service
  8. dml操作mysql_数据库DML操作(DCL了解)
  9. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_12-MongoDb入门-基础概念...
  10. android sudio连接服务器教程,Android Studio连接手机设备教程
  11. 高效办公之远程电脑控制:再也不用带着厚重笔记本
  12. 批量调度工具 Taskctl 作业类型的维护管理
  13. TFT液晶屏是怎样诞生的?
  14. 黑莓断网 思考 apn激活pdp整个过程
  15. Python判断html的元素,python判断网页元素是否存在的方法
  16. 实现全站http到https的301转向(实测有用)
  17. 金陵科技学院计算机分数,2018金陵科技学院录取分数线
  18. VTK: 拾取方式的三种实现
  19. C++背包问题——完全背包必须装满的方案数
  20. Android 原生控件之三 ProgressBar

热门文章

  1. 豆瓣引流能赚钱吗?怎么做?
  2. 安卓内存监控apk,Android程序员如何有效提升学习效率?深夜思考
  3. 190个国家和地区111种语言Windows 10今夏正式发布
  4. 使用 ffmpeg 命令将视频转图片
  5. 总是做不好需求管理?这6款必备工具送给你
  6. PAT 1012 The Best Rank (25 分)
  7. LinkedSee灵犀朱品燕:开启AIOps新时代
  8. type有字体的意思吗,type用中文怎么说
  9. python获取邮件内容_python 接收邮件获取邮件内容
  10. CentOS8提高篇8:CentOS制作U盘启动盘