1. 程式人生 > >最接近的數,二分法

最接近的數,二分法

#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;
}