所谓的分治就是指分而治之,即将较大规模的问题分解成几个较小规模的问题,通过对较小规模问题的求解达到对整个问题
的求解。
当我们将问题分解成俩个较小问题求解的分治方法称之为二分法
三分法同样是这样
对于二分法:
注意:一定要是有顺序的,可判断的
例子:
给一个长度n的单调递增的正整数序列,即序列中每一个数都比前一个数大,有m个询问,每次询问一个x,问序列中最后一个
小于等于x的数是什么?
5 3
1 2 3 4 6
5
1
3
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int k;
int s[100];
for(int i=0;i<n;i++)
cin>>s[i];
int x;
int ans;
for(int i=0;i<m;i++)
{
cin>>x;
int l=0,r=n-1;
ans=-1;
while(l<=r)
{
int mid=(l+r)/2;
if(s[mid]<=x)
{
ans=mid;
l=mid+1;
}
else
{
r=mid-1;
}
}
if(ans==-1)
cout<<"-1"<<endl;
else
cout<<s[ans]<<endl;
}
return 0;
}
Description
众所周知ly虽然是个小胖子,但是长得还是很好看的,所以她有很多小迷弟(bu cun zai de),但是ly当然不是个只看颜值的人了,所以在她觉得颜值还可以的所有人里,把这些人选出来按照智商排序...
虽然wjw不是ly的小迷弟,但是wjw很想知道某个智商值在这群人里能排多少名,那么只能麻烦你帮他了
Input
第一行一个整数N表示有N个被选出来的小迷弟
第二行N个整数分别表示这N个小迷弟的智商
接下来若干行表示wjw的询问,每行一个智商值
Output
每行一个整数表示答案
Sample Input
5 1 2 3 4 5 1 2 3 4 5
Sample Output
12345
#include<bits/stdc++.h>
using namespace std;
int s[1000005];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>s[i];
sort(s,s+n);
int x;
while(cin>>x)
{
int l=0,r=n-1;
int ans;
while(l<=r)
{
int mid=(r+l)/2;
if(s[mid]>=x)
{
ans=mid;
r=mid-1;
}
else
l=mid+1;
}
cout<<ans+1<<endl;
//cout<<lower_bound(s,s+n,x)-s+1<<endl;
}
}
这题可以用low_bound()但是上题不可以用注意使用条件
例题1:点击打开链接
例题2:点击打开链接