问题标题: 酷町堂:1754 序列询问

0
0
已解决
徐子宸
徐子宸
中级天翼
中级天翼

1754   序列询问经验值:1200

题目描述 Description

给一个长度为 n 的单调增的正整数序列,即序列中每一个数都比前一个数大。

对该序列进行 m 次询问,每次询问一个数 x,问序列中最后一个小于等于 x 的数是多少?

输入描述 Input Description

第一行:整数 n m,分别表示序列长度和询问次数
第二行:n 个数组成的单调增序列
接下来m行:每次询问用的数 x

输出描述 Output Description

输出:m行,每行表示该序列中最后一个小于等于 x 的数是的大小。

假如找不到这个数则输出 -1。

样例输入 Sample Input

5 3 1 2 3 4 6 5 1 3

样例输出 Sample Output

4 1 3

数据范围及提示 Data Size & Hint

1 <= n,m <=100000

序列中的元素及 x 的大小都 <= 10^6

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int a[1000050];
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=m;i++){
        int x;
        cin>>x;
        if(a[n]<x||a[1]>x){
            cout<<-1<<endl;
        }else{
            for(int j=n;j>=1;j--){
                if(a[j]<=x){
                    cout<<a[j]<<endl;
                    break;
                }
            }
        }
    }
    return 0;
}

60分?

为啥?

大佬求助!


0
已采纳
陈正朔
陈正朔
初级光能
初级光能

这题明明是二分查找的模板

核心

先将a[0]赋为-1

while(l<=r){
            mid=(l+r)/2;
            if(a[mid]<=x) l=mid+1;
            else r=mid-1;
        }

因为找不到时,r=0,所以直接输出a[r]就行了

 

注意,二分前数组要排序!

0
张帆
张帆
中级天翼
中级天翼

这还问为啥?O(nm)算法肯定超时好吧

0
我要回答