二分/三分

分治最重要的思想不仍是二分查找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); }
相關文章
相關標籤/搜索