二分练习题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;
}
二分练习题3 查找小于x的最大元素 题解的更多相关文章
- 二分练习题2 查找大于等于x的最小元素 题解
题目描述 现在告诉你一个长度为 \(n\) 的有序数组 \(a_1, a_2, ..., a_n\) ,以及 \(q\) 次询问,每次询问会给你一个数 \(x\) ,对于每次询问,你需要输出数组 \( ...
- P1043 查找小于x的最大元素
题目描述 现在告诉你一个长度为 \(n\) 的有序数组 \(a_1, a_2, ..., a_n\) ,以及 \(q\) 次询问,每次询问会给你一个数 \(x\) ,对于每次询问,你需要输出数组 \( ...
- 9.算法之顺序、二分、hash查找
一.查找/搜索 - 我们现在把注意力转向计算中经常出现的一些问题,即搜索或查找的问题.搜索是在元素集合中查找特定元素的算法过程.搜索通常对于元素是否存在返回 True 或 False.有时它可能返回元 ...
- 算法之顺序、二分、hash查找
算法之顺序.二分.hash查找 一.查找/搜索 - 我们现在把注意力转向计算中经常出现的一些问题,即搜索或查找的问题.搜索是在元素集合中查找特定元素的算法过程.搜索通常对于元素是否存在返回 Tru ...
- 【Data Structure & Algorithm】 查找最小的k个元素
查找最小的k个元素 题目:输入n个整数,输出其中最小的k个. 例如输入1, 2, 3, 4, 5, 6, 7和8这八个数字,则最小的4个数字为1, 2, 3和4. 分析:这道题最简单的思路是把输入的n ...
- 力扣算法:LC 704-二分查找,LC 27-移除元素--js
LC 704-二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 ...
- 【编程题目】查找最小的 k 个元素
5.查找最小的 k 个元素(数组)题目:输入 n 个整数,输出其中最小的 k 个.例如输入 1,2,3,4,5,6,7 和 8 这 8 个数字,则最小的 4 个数字为 1,2,3 和 4. 算法里面学 ...
- 查找最小的k 个元素之C#算法实现
紧接着上一篇微软编程面试100题,这次想解决的是查找最小的K个元素,题目是:输入n 个整数,输出其中最小的k 个.例如输入1,2,3,4,5,6,7 和8 这8 个数字,则最小的4 个数字为1,2,3 ...
- 查找最小的K个元素,使用最大堆。
查找最小的K个元素,使用最大堆,具体代码如下: #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace st ...
随机推荐
- 逆向破解之160个CrackMe —— 013
CrackMe —— 013 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...
- Ubuntu安装时出现“failed to load ldlinux.c32”
Ubuntu安装时出现“failed to load ldlinux.c32” 利用UltraISO制作了ubuntu 18.04的U盘启动,开机F12键USB启动时出现 1 2 Failed to ...
- Spring-Boot:Profile简单示例
//Resources目录下创建 application.properties spring.profiles.active=prod //Resources目录下创建 application-pro ...
- Scala 系列(二)—— 基本数据类型和运算符
一.数据类型 1.1 类型支持 Scala 拥有下表所示的数据类型,其中 Byte.Short.Int.Long 和 Char 类型统称为整数类型,整数类型加上 Float 和 Double 统称为数 ...
- silverlight中递归构造无限级树treeview+checkbox
两个实体,其实一个实体也能构造出来,我这里是为了增加一个 checkbox //第一个实体 public class person { public int no { get; set; } publ ...
- Linux系统下LNMP架构搭建
一.防火墙状态: 1.查看防火墙状态: systemctl status firewalld service iptables status firewall-cmd --state 2.永久有效开启 ...
- ABAP实现Geohash
前几天群里有人问ABAP有没有Geohash函数,用来帮助SAP存储门店位置.实现对附近门店查找的功能.因为没有查到,所以我动手写了一个. Geohash是什么 Geohash是一种公共域地理编码系统 ...
- .Net之微信小程序获取用户UnionID
前言: 在实际项目开发中我们经常会遇到账号统一的问题,如何在不同端或者是不同的登录方式下保证同一个会员或者用户账号唯一(便于用户信息的管理).这段时间就有一个这样的需求,之前有个客户做了一个微信小程序 ...
- HAOI2006 (洛谷P2341)受欢迎的牛 题解
HAOI2006 (洛谷P2341)受欢迎的牛 题解 题目描述 友情链接原题 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之 ...
- 掀起你的盖头来:浅谈项目管理办公室(PMO)
[提示]本文为“分享:<PMBOOK>读书笔记系列”由傻瓜(来自人人都是产品经理6群)编写. 之前与大家一定对项目.项目管理.项目集.项目组合等知识进行了简单的学习,如果有不太清楚和不太明 ...