找数

所谓分治就是指的分而治之,即将较大规模的问题分解成几个较小规模的问题,通过对较小规模问题的求解达到对整个问题的求解。
当我们将问题分解成两个较小问题求解时的分治方法称之为二分法。
分治的基本思想是将一个规模为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;
}

如果运气好也是错,那我倒愿意错上加错!

❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/6623834.html