• 二分练习题3 查找小于x的最大元素 题解


    题目描述

    现在告诉你一个长度为 (n) 的有序数组 (a_1, a_2, ..., a_n) ,以及 (q) 次询问,每次询问会给你一个数 (x) ,对于每次询问,你需要输出数组 (a) 中小于 (x) 的最大元素。

    输入格式

    输入的第一行包含一个整数 (n(1 le n le 100000)) ,用于表示数组中元素的个数。
    输入的第二行包含 (n) 个整数,两两之间有一个空格,用于表示数组中的元素 (a_1, a_2, ..., a_n(1 le a_i le 10^9,并且 a_1 le a_2 le ... le a_n))
    输入的第三行包含一个整数 (q(1 le q le 100000)) ,用于表示询问的次数。
    接下来 (q) 行,每行包含一个整数 (x(1 le x le 10^9)) ,表示要询问的数。

    输出格式

    对于每一次询问的 (x) ,如果数组 (a) 中存在小于 (x) 的元素,则输出数组 (a) 中满足小于 (x) 条件的所有元素中最大的元素;否则输出“-1” 。每个输出结果占单独的一行。

    样例输入

    5
    3 5 7 9 11
    3
    2
    9
    15
    

    样例输出

    -1
    7
    11
    

    题目分析

    本题涉及算法:二分。
    本题思路和上一题——《查找大于等于x的最小元素》——类似。
    我们同样还是在初始时开一个 (L = 1) ,开一个 (R = n) (分别表示左右边界),开一个 (res = -1) (用于记录小于 (x) 的最大的数的坐标)。
    满足循环条件 (L le R) 时使 (mid = (L+R)/2) ,并判断:

    • 如果 (a[mid] lt x) (满足条件),则更新 (res)(mid) ,同时 (L = mid + 1)
    • 否则(不满足条件,即 (a[mid] ge x) ),(R = mid - 1)

    实现代码如下:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 100010;
    int n, a[maxn], q, x;
    
    // solve函数用于返回大于等于x的最小元素
    int solve(int x) {
        int L = 1, R = n, res = -1;
        while (L <= R) {
            int mid = (L + R) / 2;
            if (a[mid] < x) {
                res = mid;
                L = mid + 1;
            }
            else R = mid - 1;
        }
        if (res == -1) return -1; // 如果循环结束res==-1,说明没有找到答案
        return a[res];  // 因为res存的是最优解的坐标,所以返回a[res]
    }
    
    int main() {
        cin >> n;
        for (int i = 1; i <= n; i ++) cin >> a[i];
        cin >> q;
        while (q --) {
            cin >> x;
            cout << solve(x) << endl;
        }
        return 0;
    }
    
  • 相关阅读:
    第八周作业
    第七周上机作业2
    神经网络基础
    [网鼎杯 2020 青龙组]AreUSerialz
    BJDCTF 2nd old-hack
    php反序列化漏洞学习
    CTFHUB-HTTP协议
    ctfhub-密码口令
    CTFHUB-信息泄漏
    buuctf-[BJDCTF 2nd]elementmaster
  • 原文地址:https://www.cnblogs.com/zifeiynoip/p/11450624.html
Copyright © 2020-2023  润新知