分治算法

所谓的分治就是指分而治之,即将较大规模的问题分解成几个较小规模的问题,通过对较小规模问题的求解达到对整个问题

的求解。

当我们将问题分解成俩个较小问题求解的分治方法称之为二分法

三分法同样是这样



对于二分法:

注意:一定要是有顺序的,可判断的

例子:

给一个长度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:点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值