01:查找最接近的元素

简介: http://noi.openjudge.cn/ch0111/01/01:查找最接近的元素总时间限制: 1000ms 内存限制: 65536kB描述在一个非降序列中,查找与给定值最接近的元素。

http://noi.openjudge.cn/ch0111/01/

01:查找最接近的元素

总时间限制: 
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
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int main(int argc, char *argv[])
 4 {
 5     int n,i,*a,m,t;
 6     int begin,end,mid;
 7     int x,y;
 8     
 9     scanf("%d",&n);
10     a=(int *)malloc(n*sizeof(int));
11     for(i=0;i<n;i++) scanf("%d",&a[i]);
12     
13     scanf("%d",&m);
14     for(i=0;i<m;i++)
15     {
16         scanf("%d",&t);
17         if(a[0]>t) { printf("%d\n",a[0]); continue;}
18         else if(a[n-1]<t) { printf("%d\n",a[n-1]); continue;}
19         
20         begin=0;
21         end=n-1;
22         mid=(begin+end)/2;
23         while(begin<=end)   //while(end-begin>1)
24         {
25             if(a[mid]==t) { printf("%d\n",a[mid]);break;}
26             else 
27             {
28                 if(a[mid]>t)
29                 {
30                     end=mid-1;
31                 }
32                 else 
33                 {
34                     begin=mid+1;
35                 }
36             }
37             mid=(begin+end)/2;
38         }
39         if(a[mid]!=t)
40         {
41             x=abs(a[begin]-t);
42             y=abs(a[end]-t);
43             if(x<y) printf("%d\n",a[begin]);
44             else if(x>y) printf("%d\n",a[end]);
45             else printf("%d\n",(a[begin]<a[end]?a[begin]:a[end]));
46         }
47     }
48     free(a);
49     return 0;
50 }

 

相关文章
|
1月前
查找数组中最小的元素
【10月更文挑战第30天】查找数组中最小的元素。
38 5
|
4月前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
4月前
|
算法 索引
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
这篇文章介绍了LeetCode第34题"在排序数组中查找元素的第一个和最后一个位置"的解题方法,通过使用双指针法从数组两端向中间同时查找目标值,有效地找到了目标值的首次和最后一次出现的索引位置。
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
|
7月前
|
算法
leetcode-34:在排序数组中查找元素的第一个和最后一个位置
leetcode-34:在排序数组中查找元素的第一个和最后一个位置
35 0
|
算法
【算法专题突破】二分查找 - 在排序数组中查找元素的第一个和最后一个位置(17)
【算法专题突破】二分查找 - 在排序数组中查找元素的第一个和最后一个位置(17)
71 0
1240:查找最接近的元素 2020-12-27
1240:查找最接近的元素 2020-12-27
|
算法 C语言 C++
【二分查找】34. 在排序数组中查找元素的第一个和最后一个位置
二分查找是一种高效的查找算法,其时间复杂度为 O(log n)。在许多情况下,我们需要在一个有序数组中找到某个目标值的搜索范围。本文将介绍一种基于二分查找的搜索范围查找算法,该算法能够快速找到目标值在数组中的起始和结束位置。
79 0
|
算法
每日一题—— 在排序数组中查找元素的第一个和最后一个位置
每日一题—— 在排序数组中查找元素的第一个和最后一个位置
|
算法
算法|寻找不规律栈中最小元素
算法|寻找不规律栈中最小元素
74 0