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

您所在的位置:网站首页 大于等于一个数的最小整数 二分练习题3 查找小于x的最大元素 题解

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

2024-07-13 07:34| 来源: 网络整理| 查看: 265

题目描述

现在告诉你一个长度为 \(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 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 > n; for (int i = 1; i > a[i]; cin >> q; while (q --) { cin >> x; cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3