B Antiamuny wants to leaern binary search again

news/2024/10/22 11:36:26/

题目:

C/C++:

int f(int l,int r,int x) { // l <= x <= rint cnt = 0;while(l <= r) {cnt++;int mid = (l + r) / 2;if (mid == x) break;if (mid < x) l = mid + 1;else r = mid - 1;}return cnt;
}

样例:

输入
5
3 7 2
6 12 2
2 10 3
6 14 8
5 8 1

输出
6
11
9
-1
6

思路:

        根据题意,暴力循环 l 到 r 一个样例肯定不会超时,但是这里有测试样例 t 就会导致超时,

刚好题目已经给出了二分模板,我们可以根据二分模板,二分查找 l 和 r 中是否有 x 的 cnt 循环满足我们需要找的 cnt 即可

代码详解如下:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <unordered_map>
#define endl '\n'
#define YES puts("YES")
#define NO puts("NO")
#define umap unordered_map
#pragma GCC optimize(3,"Ofast","inline")
#define ___G std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 2e6 + 10;int cnt;	// 全局定义 cnt// 题目所给的寻找 x 二分循环次数
inline int f(int l,int r,int x) { // l <= x <= rint cnt = 0;while(l <= r) {cnt++;int mid = (l + r) >> 1;if (mid == x) break;if (mid < x) l = mid + 1;else r = mid - 1;}return cnt;
}// 这里我们二分对应的 l r 寻找 x 是否有我们要找的 cnt
inline int TwoFind(int l,int r) { // l <= x <= r// 这里的 tl 和 tr 是存储好原来的 l r,// 方便 我们 寻找二分 x cnt 的次数 int tl = l,tr = r,F;while(l <= r) {int mid = (l + r) >> 1;// F 是二分 mid 后 cnt 次数F = f(tl,tr,mid);// 如果 当前的 mid 二分循环 cnt 次数与我们需要找的相符合// 则返回结果if (F == cnt) return mid;// 否则继续查找if (F < cnt) l = mid + 1;else r = mid - 1;}// 如果找不到,返回 -1return -1;
}inline void solve()
{int l,r;cin >> l >> r >> cnt;int ans = TwoFind(l,r);cout << ans << endl;
}int main()
{
//	freopen("a.txt", "r", stdin);___G;int _t = 1;cin >> _t;while (_t--){solve();}return 0;
}

最后提交:


http://www.ppmy.cn/news/1099103.html

相关文章

vue3+ts 分享海报

安装依赖1. npm install html2canvas --save<div class"flex-box"><div><div v-for"(item,index ) in from.list" :key"index" click"actvieFuntion(index)"><div>{{item}}</div><div :class"…

Revit SDK 介绍:PrintLog 打印日志

前言 这个例子介绍了如何使用打印相关的事件。 内容 事件机制也是老生常谈了&#xff0c;Revit 提供了大量的可供注册的事件&#xff1a;Revit API&#xff1a;Events 事件总览 注册和 print 相关的事件&#xff1a; // IExternalApplication.OnStartup m_eventsReactor …

单片机电子元器件-按键

电子元器件 按键上有 四个引脚 1 2 、 3 4 按下之后 导通 1 3 、 2 4 初始导通 通常按键开关为机械弹性开关&#xff0c;开关在闭合不会马上稳定的接通&#xff0c;会有一连串的抖动 抖动时间的长短有机械特性来决定的&#xff0c;一般为5ms 到10 ms 。 消抖的分类 硬件消…

深浅拷贝与赋值

数据类型 数据类型 在JavaScript中&#xff0c;数据类型有两大类。一类是基本数据类型&#xff0c;一类是引用数据类型。 基本数据类型有六种&#xff1a;number、string、boolean、null、undefined、symbol。 基本数据类型存放在栈中。存放在栈中的数据具有数据大小确定&a…

【Python 程序设计】Python 中的类型提示【06/8】

目录 一、说明 二、什么是动态类型&#xff1f; 2.1 为什么要使用类型提示&#xff1f; 2.2 局限性 三、基本类型提示 3.1 声明变量的类型 3.2 函数注释 四、Python 中的内置类型 4.1 原子类型与复合类型 五、函数注释 5.1 如何指定函数的参数类型和返回类型 5.2 在函数签名中…

Jdk1.7之ConcurrentHashMap源码总结

文章目录 一、常见属性1. 初始化容量2. 加载因子3. 并发级别 二、重要方法1. 构造方法2. ConcurrentHashMap#put方法2.1 ConcurrentHashMap#put#ensureSegment2.2 ConcurrentHashMap#Segment#put2.2.1 Segment#put#scanAndLockForPut2.2.2 Segment#put#rehash 3. ConcurrentHas…

CentOS 7 调优之周期性的访问中断

文章目录 背景问题描述原因分析解决方案相关版本 背景 操作系统版本&#xff1a;CentOS Linux release 7.6.1810 (Core) 操作系统镜像安装后&#xff0c;未进行任何调整。正常部署应用&#xff0c;应用在 CentOS 7.9 未出现过此类现象。 问题描述 问题描述&#xff1a;负载教…

软件源码开发,网络中的“摄像头”:运维监控系统

在日常生活中&#xff0c;我们不管是在大街小巷&#xff0c;还是在商场大厦都可以见到一个圆形或是方形带有镜片的“小盒子”&#xff0c;这个“小盒子”就是摄像头&#xff0c;摄像头作为一个能实时录制记录它能照到范围内的视频图像的工具&#xff0c;可以在丢失物品、抓捕坏…