一、题目
二、算法思路
这道题的思路不是很难,就是后两个测试点对应的范围比较大,需要优化一下代码来提高效率。
原本我使用的是c++
写的代码,后两个测试点过不去,但换成了c
进行提交的时候就过了。
如果你也出现了后两个测试点过不去的情况,不妨试试用其他语言编写提交。
题目给了我们一个
非降序列
,其实这个题意就是说已经给了我们一组升序的数,所以我们可以省去不必要的排序操作。
我是直接使用的两个变量,一个存最小差值,一个是最近邻。
如果输入的是第一个数时,就进行初始化。
若当前输入的值更接近x
的值时,就替换掉flag和value
。
三、代码
//作者:小狐狸
#include<stdio.h>
#include<math.h>
int main()
{
int n,x;
int i;
int flag;//最近邻
int value;//最小差值
scanf("%d%d",&n,&x);
for(i=1;i<=n;i++)
{
int tmp;//临时变量
scanf("%d",&tmp);
if(i==1)//初始化最小差值、最近邻
{
flag = tmp;
value = abs(tmp-x);
}
else if(value>abs(tmp-x))//出现更小的差值时
{
flag = tmp;
value = abs(tmp-x);
}
}
printf("%d\n",flag);
return 0;
}