二分

左边界模板    找第一个大于等于x的数

        while(l < r)
        {
            mid = l+r >> 1;
            if(a[mid].s >= k) r = mid;
            else l = mid + 1;
        }
        if(a[l].s == k) cout << a[l].num << " ";
        else {
            cout << "-1 -1" << endl; 
            continue;
        }

右边界模板    找第一个小于等于x的数

    while(l < r)
        {
            mid = l+r+1 >> 1;//注意加一,否则会陷入死循环
            if(a[mid].s <= k) l = mid;
            else r = mid - 1;
        }
        if(a[l].s == k) cout << a[l].num << " " << endl;
        else {
            cout << "-1 -1" << endl; 
            continue;
        }

题目:https://www.acwing.com/problem/content/description/791/

 

 

数的三次方根

题目:https://www.acwing.com/problem/content/792/

 

 原理还是使用的是二分的思想

#include<iostream>
using namespace std;
double n;
int main()
{
    scanf("%lf", &n);
    double l = -10000;
    double r = 10000;
    double mid;
    while(r - l >= 1e-8)
    {
        mid = (l+r)/2;
        if(mid*mid*mid >= n) r = mid;
        else l = mid;
    }
    printf("%lf", mid);
    return 0;
} 

 

posted @ 2020-09-02 20:33  ATKevin  阅读(117)  评论(0)    收藏  举报