本题地址:http://noi.openjudge.cn/ch0111/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);
//根据输入的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 }
2638

被折叠的 条评论
为什么被折叠?



