算法基礎——二分

1. 思想

2. 模板

3. 應用

  1. 數的範圍

題目鏈接

#include <iostream>

using namespace std;

const int N = 1e6+10;
int arr[N];

int main()
{
    int n, q;
    scanf("%d %d", &n, &q);
    
    for(int i=0; i<n; i++)  scanf("%d", &arr[i]);
    
    while(q--)
    {
        int x;
        scanf("%d", &x);
        
        int l=0, r=n-1;
        while(l < r)
        {
            int mid = (l+r)>>1;
            if(arr[mid] >= x)   r = mid;
            else    l = mid+1;
        }
        
        if(arr[l] != x) cout<<"-1 -1"<<endl;
        else{
            cout<<l<<" ";
            l=0, r=n-1;
            while(l < r)
            {
                int mid = (l+r+1)>>1;
                if(arr[mid] <= x)   l = mid;
                else    r = mid-1;
            }
            
            cout<<l<<endl;
        }
    }
    return 0;
}
  1. 浮點數二分

題目鏈接

#include <iostream>

using namespace std;


int main()
{
    double n;
    cin>>n;
    
    double l = -10000, r = 10000;
    while(r-l > 1e-8)
    {
        double mid = (l+r)/2;
        if(mid*mid*mid >= n)    r = mid;
        else    l = mid;
    }
    
    printf("%lf", l);
    return 0;
}
  • 注:本系列參考:AcWing。。。
發佈了96 篇原創文章 · 獲贊 29 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章