zoukankan      html  css  js  c++  java
  • 二分/三分

    分治最重要的思想不还是二分查找

    二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

    首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

    --from 百度百科

    Code

     

    #include <iostream>
    #include <algorithm>
    using namespace std;
    typedef long long ll;
    inline ll read(){
        ll x=0,f=1; char ch=getchar();
        while(!isdigit(ch)) (ch=='-')&(f=-1),ch=getchar();
        while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); return x*f;
    }
    int n;
    const int N=1<<20;
    int a[N];
    signed main(){
        n=read();
        for(register int i=1;i<=n;i++) a[i]=read();
        int find=read();
        sort(a+1,a+n+1);
        int l=0,r=n;
        while(l<r){
            int mid=l+r>>1;
            if(a[mid]<find) l=mid+1; else r=mid;
        }
        if(l>n) puts("No find");
        else cout<<l<<endl;
        return 0;
    }

     三分法

    #include<stdio.h>
    int n;
    double a[13];
    inline double f(const double x){
        double ret=0;
        for(int i=n;i;--i)ret=ret*x+a[i];
        return ret;
    }
    int main(){
        double left,right,mid;
        scanf("%d%lf%lf",&n,&left,&right);
        for(int i=n;i;--i){
            scanf("%lf",a+i);
            a[i]*=i;
        }
        while(right-left>1e-6)
            if(f(mid=(right+left)/2)>0)left=mid;
            else right=mid;
        printf("%.5lf
    ",left);
    }
    不存在十全十美的文章 如同不存在彻头彻尾的绝望
  • 相关阅读:
    ISO9126 软件质量模型
    java 15.String
    java 14. ArrayList常用方法
    java 13. 方法重载构造方法块this用法
    linux ssh连接心跳检查断开连接
    关于递归,我有几句话想说
    pytest 报错 ImportError: cannot import name 'main'
    递归回溯剪枝之斐波那契数列
    appium-doctor诊断信息不完整
    数据驱动,关键字驱动,混合驱动简单模型
  • 原文地址:https://www.cnblogs.com/qf-breeze/p/10349101.html
Copyright © 2011-2022 走看看