解题思路二分查找
注意事项:简单的二分 中间加一个判断 大于这个中间数 小于后面一个数:
参考代码:
#include<bits/stdc++.h>
using namespace std;
//防止数过大 都开的long long
long long a[100000];
//传数组 左边值l 一般为0 右边值r为长度-1 tar为目标数
//下面这个为标准的二分查找
/*long long f1(long long a[],long long l,long long r,long long tar)
{
while(l <= r)
{
long long mid = (l+r)/2;
if(a[mid] == tar) return mid;
if(a[mid] < tar) l = mid+1;
if(a[mid] > tar) r = mid-1;
}
}*/
long long f1(long long a[],long long l,long long r,long long tar)
{
while(l <= r)
{
long long mid = (l+r)/2;
//这个查最近的值 则加一个 判断 正好大于mid中间这个数 并且小于后面一个数就行
if(a[mid] == tar || a[mid] < tar && a[mid+1] > tar) return mid; //return的为下标
if(a[mid] < tar) l = mid+1;
if(a[mid] > tar) r = mid-1;
}
}
int main()
{
long long m,n,k,i,j;
cin >> m;
for(i = 0; i < m;i++)
cin >> a[i];
sort(a,a+m);//简单排序
cin >> n;
while(n--)
{
cin >> k;
if(k >= a[m-1])//如果大于最大的 肯定输出最后一个
{
cout << a[m-1]<<endl;
continue;
}
if(k <= a[0])//小于最小的 肯定输出第一个
{
cout << a[0] << endl;
continue;
}
int lp = f1(a,0,m-1,k);//lp接收传回来的下标
if(a[lp] == k)//等于 输出
cout << k << endl;
else if(k - a[lp] > a[lp+1] - k)//这个判断 该数与前后哪一个数离的近
cout << a[lp+1] << endl;
else cout << a[lp]<<endl;
}
return 0;
}
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复