最接近的數,二分法
#include<iostream>
#include<cmath>
#define INF 999999999
using namespace std;
int n,m,a[110000];
int main()
{
int i;
cin>>n;
for( i=1;i<=n;i++) cin>>a[i];
cin>>m;
for( i=1;i<=m;i++)
{
a[0]=-INF;
a[n+1]=INF;
int x;
int left=1,right=n,mid;
cin>>x;
while(left<=right)
{
mid=(left+right)/2;
if(a[mid]<=x) left=mid+1;//L必定指向大於x的部分,r必定指向小於等於x的部分,這種寫法的特點是l和r在結束搜尋的時候會位置產生交叉,這時候要考慮搜尋陣列的兩頭情況,可能已經到達了躍出原有資料的情況,可以考慮給兩頭躍出的資料賦予極值以排除疏忽性的錯誤。
else right=mid-1;
}
if(fabs(a[right]-x)>fabs(a[left]-x))
cout<<a[left]<<endl;
else cout<<a[right]<<endl;
}
return 0;
}
#include<iostream>
#include<cmath>
using namespace std;
int n,m,a[110000];
int main()
{
int i;
cin>>n;
for( i=1;i<=n;i++) cin>>a[i];
cin>>m;
for( i=1;i<=m;i++)
{
int x;
int left=1,right=n,mid;
cin>>x;
while(left<right-1)//指向了相差一個距離的範圍內,避免指向兩端以外區域造成資料錯誤。
{
mid=(left+right)/2;
if(a[mid]<x) left=mid;//r指向了大於等於x的部分,l指向了小於x的部分
else right=mid;
}
if(fabs(a[right]-x)>=fabs(a[left]-x))//注意這裡的等於號,根據題目要求多個數滿足條件,輸出最小的一個
cout<<a[left]<<endl;
else cout<<a[right]<<endl;
}
return 0;
}