zoukankan      html  css  js  c++  java
  • 洛谷-P2249 【深基13.例1】查找

    题目描述

    输入 n(n≤1e6) 个不超过1e9的单调不减的(就是后面的数字不小于前面的数字)非负整数a1​,a2​,…,an​,然后进行 m(m≤1e5) 次询问。对于每次询问,给出一个整数 q(q≤1e9),要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 -1。

    输入格式

    第一行 2 个整数 n 和 m,表示数字个数和询问次数。

    第二行 n 个整数,表示这些待查询的数字。

    第三行 m 个整数,表示询问这些数字的编号,从 1 开始编号。

    输出格式

    m 个整数表示答案。

    输入输出样例

    输入#1

    输出#1

    11 3

    1 3 3 3 5 7 9 11 13 15 15

    1 3 6

    1 2 -1

    题目分析

    n最大为1e6可见其数据规模比较大,要进行m(最大1e5)次询问,根据这两个数据可知普通的普通的查找方式是肯定行不通的。数据单调不减数的(数列递增),据此就可以采用二分查找来查询数据了。

    可行代码

    #include <iostream>
    using namespace std;
    
    int search(int key, int *arr, int len)
    {
        int l = -1, r = len, mid; // 注意的是数组是从0开始的
        while (l + 1 < r)
        {
            mid = l + r >> 1;
            if (arr[mid] <= key)
                l = mid;
            else
                r = mid;
        }
        if (arr[r] == key + 1)
            return r; // 返回的是大于key的第一个位置
        return -1;
    }
    
    int main()
    {
        int n, m;
        cin >> n >> m;
        int arr[n];
        for (int i = 0; i < n; i++)
            cin >> arr[i];
        while (m--)
        {
            int key;
            cin >> key;
            int loc = search(key-1, arr, n);
            if (loc == -1)
                cout << -1;
            else
                cout << loc + 1;
            if (m)
                cout << ' ';
        }
        return 0;
    }

    END 感谢reader's阅读,洛谷题目链接:P2249 【深基13.例1】查找 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

  • 相关阅读:
    services parameters 是如何表现的
    session表有多少条记录?
    php://input 如何用?
    getEditableConfigNames
    UTC + 8 = Beijing Time
    file vs database
    多环境drupal安全install.php
    新建block+cache
    drupal 8 bigpipe lazy_builder
    hook_theme 的重要性
  • 原文地址:https://www.cnblogs.com/kirk-notes/p/14994772.html
Copyright © 2011-2022 走看看