所谓分治就是指的分而治之,即将较大规模的问题分解成几个较小规模的问题,通过对较小规模问题的求解达到对整个问题的求解。
当我们将问题分解成两个较小问题求解时的分治方法称之为二分法。
分治的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相似。
找出各部分的解,然后把各部分的解组合成整个问题的解。
Eg:
找数
找一个长度为n的单调递增的正整数序列,即序列中的每一个数都比前一个数大。有m个询问,每次询问一个x,问序列中最后一个小于等于x的数是什么?
输入 第一行2整数n,m。
接下来m行每行一个数,表示这个序列。
接下来m行每行一个数,表示一个询问。
输出m行,表示序列中最后一个小于等于x的数是什么。假如没有,输出-1;
思路:
这很显然就是二分答案的题
上代码:
#include<iostream> #include<cstdio> using namespace std; int n,m,a[111111]; int main() { scanf("%d %d",&n,&m); for(int i=1; i<=n; i++) cin>>a[i]; a[0]=-1; for(int i=1,x; i<=m; i++) { int l=1,r=n,mid; cin>>x; while(l<=r) { mid=l+r>>1; if(a[mid]<=x) l=mid+1; else r=mid-1; } cout<<a[r]<<endl; } return 0; }