二分/三分

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

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

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

--from 百度百科code

Codeblog

 

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

 三分法get

#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\n",left); }
相关文章
相关标签/搜索