解题思路二分查找
注意事项:简单的二分 中间加一个判断 大于这个中间数 小于后面一个数:
参考代码:
#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语言程序设计教程(第三版)课后习题6.11 (C++代码)(有个库函数叫sqrt)浏览:981 |
C语言程序设计教程(第三版)课后习题10.1 (C语言代码)浏览:736 |
C语言训练-角谷猜想 (C++代码)(3N+1问题)浏览:1850 |
A+B for Input-Output Practice (VI) (C++代码)浏览:445 |
【数组的距离】 (C语言代码)浏览:787 |
淘淘的名单 (C语言代码)浏览:1167 |
简单的a+b (C语言代码)浏览:572 |
C语言训练-8除不尽的数 (C语言代码)浏览:1469 |
数列排序 (C语言代码)浏览:674 |
C语言程序设计教程(第三版)课后习题11.5 (C语言代码)浏览:1029 |