蓝桥杯专项复习——二分

news2025/4/26 8:24:33

目录

二分查找、二分答案基础知识

二分查找模版

【模版题】数的范围

借教室


二分查找、二分答案基础知识

二分查找模版

【模版题】数的范围

输入样例

6 3
1 2 2 3 3 4
3
4
5

输出样例

3 4
5 5
-1 -1

思路:

对应两个模版,起始位置是对应第一个模版,即后面的都符合
终止位置对应第二个模拟,即前面的符合

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=100000+10;

int a[N];

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	
	int n,q;cin>>n>>q;
	for(int i=0;i<n;i++)
		cin>>a[i];
	while(q--)
	{
		int x;cin>>x;
		int l=0,r=n-1;
		while(l<r)//查找起始位置,右边符合 
		{
			int mid=(l+r)/2;
			if(a[mid]>=x)
				r=mid;
			else
				l=mid+1;
		}
		if(a[l]!=x)//不存在
			cout<<"-1 -1"<<endl;
		else//查找终止位置 
		{
			cout<<l<<' ';//将起始位置输出 
			l=0,r=n-1;
			while(l<r)
			{
				int mid=(l+r+1)/2;
				if(a[mid]<=x)
					l=mid;
				else
					r=mid-1;
			}
			//不用再判断是否存在 
			//输出终止位置 
			cout<<l<<endl;
		 } 
	}
	return 0;
 } 

借教室

输入样例1

4 3
2 5 4 3
2 1 3
3 2 4
4 2 4

输出样例1

2

说明1

第一份订单满足后,这四天剩余的教室数为{0,3,2,3}
第二份订单要求第二天到第四天每天提供3个教室,而第三天剩余的教室数为 2,
因此无法满足。分配停止,通知第二个申请人修改订单。

输入样例2

4 1
2 5 4 3
2 1 3

输出样例2

0

思路:

遍历订单,再对所遍历到的订单从第一个1开始进行判断。

如果直接枚举每一个订单是O(n),再判断又是O(n),时间复杂度就会是O(n^2),会超时,需要优化。

优化:

二分和差分的结合
即通过二分来搜索不符合的点,使用差分实现check函数的判断

为什么使用二分:要求找到不符合的订单是搜索,并且如果前面的订单不满足后面的订单就直接取消,具有二段性,可以使用二分法,时间复杂度变为nlogn

为什么使用差分:一段时间其实就可以看做是一段区间,对于每个教室的申请,其实就是区间修改,完全符合差分条件

 满足的条件是申请教室小于空闲教室,模版1符合
本题重点其实还是差分,二分只是优化了时间复杂的,实际的判断功能是通过差分实现。

表示是否全部分配完的方案:即特判
令r=m+1,表示有m个订单,当退出循环时l=m+1表示所有m个订单都可分配教室,就输出0;如果r=m,结束当l=m时不清楚第m个订单是否分配到

#include<iostream>
#include<bits/stdc++.h>
#define int long long 

using namespace std;

const int N=1000000+10;
int n,m;
int a[N],b[N];
int c[N],l[N],r[N];

bool check(int x)
{
	//对每次的订单都是从1开始到x,且内容都可以实现更新 
	for(int i=1;i<=n;i++)
		b[i]=a[i]-a[i-1];//构建a的差分数组
		
	//实现对a数组的特定范围都减去c
	for(int i=1;i<=x;i++)//对第1~x个订单进行操作 
	{  
		b[l[i]]-=c[i];
		b[r[i]+1]+=c[i];
	 } 
	for(int i=1;i<=n;i++)
	{
		b[i]+=b[i-1];//将差分数累加,其实是a[i] 
		if(b[i]<0)//如果a[i]<0相当于教室数不足
			return true; 
	}
	return false;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i]; //每天可借的订单数
		
	for(int i=1;i<=m;i++)
	 //订单数据 ,这里先导入是为了后面使用差分对订单进行判断 
		cin>>c[i]>>l[i]>>r[i];
	
	//题目是要求找到不符合的订单而且订单具有二段性
	//最快的方法是使用二分进行查找 
	int l=1,r=m+1;//对订单进行遍历  
	while(l<r)
	{
		int mid=(l+r)/2;
		//判断第1~第mid个订单是否符合题意
		//这里是将申请教室小于空闲教室作为答案
		//即左边为所符合的答案,使用模版1 
		if(check(mid)) //当教室不足时为true,r=mid即将该订单舍去,遍历前面的订单 
			r=mid;
		else //当1~mid订单符合时左范围增大,使得查询订单数向后挪 
		//当所有都符合时l==r==m+1 
			l=mid+1; 
	 } //结束条件是l==r 
	if(l==m+1)
		cout<<'0'<<endl;
	else
		cout<<r<<endl;
	return 0;
 } 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2326011.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

oracle中java类的使用

方式一&#xff1a; 编写一个简单的java类 vi OracleJavaDemo.java public class OracleJavaDemo { public static String processData(String input) { return "Processed: " input; } } 编译 javac OracleJavaDemo.java 生成OracleJavaDemo…

高并发内存池(一):项目介绍和Thread Cache实现

前言&#xff1a;本文将要介绍的高并发内存池&#xff0c;它的原型是Google的⼀个开源项⽬tcmalloc&#xff0c;全称Thread-Caching Malloc&#xff0c;近一个月我将以学习为目的来模拟实现一个精简版的高并发内存池&#xff0c;并对核心技术分块进行精细剖析&#xff0c;分享在…

MySQL与Redis数据一致性保障方案详解

前言 在现代分布式系统中&#xff0c;MySQL和Redis的结合使用非常普遍。MySQL作为关系型数据库负责持久化存储&#xff0c;而Redis则作为高性能缓存层提升系统的响应速度。然而&#xff0c;在这种架构下&#xff0c;如何保证MySQL与Redis之间的数据一致性是一个重要的挑战。本…

“钉耙编程”2025春季联赛(2)题解(更新中)

1001 学位运算导致的 1002 学历史导致的 // Problem: 学历史导致的 // Contest: HDOJ // URL: https://acm.hdu.edu.cn/contest/problem?cid1151&pid1002 // Memory Limit: 524288 MB // Time Limit: 1000 ms // // Powered by CP Editor (https://cpeditor.org)#include …

双向链表的理解

背景 代码中经常会出现双向链表&#xff0c;对于双向链表的插入和删除有对应的API函数接口&#xff0c;但直观的图表更容易理解&#xff0c;所以本文会对rt-thread内核代码中提供的双向链表的一些API函数操作进行绘图&#xff0c;方便后续随时查看。 代码块 rt-thread中提供…

基于Spring Boot的家庭理财系统app的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

【Python 算法】动态规划

本博客笔记内容来源于灵神&#xff0c;视频链接如下&#xff1a;https://www.bilibili.com/video/BV16Y411v7Y6?vd_source7414087e971fef9431117e44d8ba61a7&spm_id_from333.788.player.switch 01背包 计算了f[i1]&#xff0c;f[i]就没用了&#xff0c;相当于每时每刻只有…

nginx的自定义错误页面

正常访问一个不存在的页面是会报404这个错误 我们可以自定义错误页面 error_page 404 /40x.html 然后调用location 最后创建文件 写入你想写的内容 最后实验成功 注意在nginx的配置文件里&#xff0c;注意在加分号 在写完配置时

制作service列表并打印出来

制作service列表并打印出来 在Linux中&#xff0c;服务&#xff08;Service&#xff09;是指常驻在内存中的进程&#xff0c;这些进程通常监听某个端口&#xff0c;等待其他程序的请求。服务也被称为守护进程&#xff08;Daemon&#xff09;&#xff0c;它们提供了系统所需的各…

tkinter 库(设计图形界面系统)

几何管理的应用 # tkinter 库 是Python的标准GUI库&#xff0c;提供了创建图形用户界面的功能。 tkinter是一个跨平台的GUI库&#xff0c;支持Windows、macOS和Linux等操作系统。它是Python的标准库之一&#xff0c;无需额外安装。 #tkinter.Entry 是 Tkinter 的输入框控件类&…

在线文档协作工具选型必看:14款产品对比

本文将深入对比14款在线文档协作工具&#xff1a;PingCode; 2. Worktile; 3. 语雀; 4. 金山文档; 5. WPS云文档; 6. Google Docs; 7. 轻雀文档; 8. Microsoft 365 Online; 9. 明道云文档等。 在数字化办公日益普及的今天&#xff0c;企业对高效协同的需求不断升级&#xff0c;在…

Java虚拟机JVM知识点(持续更新)

JVM内存模型 介绍下内存模型 根据JDK8的规范&#xff0c;我们的JVM内存模型可以拆分为&#xff1a;程序计数器、Java虚拟机栈、堆、元空间、本地方法栈&#xff0c;还有一部分叫直接内存&#xff0c;属于操作系统的本地内存&#xff0c;也是可以直接操作的。 详细解释一下 程…

【计算机网络】HTTP与HTTPS

文章目录 1. HTTP定义2. HTTP交互3. HTTP报文格式3.1 抓包工具-fiddler3.2 抓包操作3.3 报文格式3.3.1 请求报文3.3.2 响应报文 4. URL5. 请求头中的方法6. GET和POST的区别7. HTTP报头7.1 Host7.2 Content_Length7.3 Content_Type7.4 User-Agent(UA)7.5 Referer7.6 Cookie 8 状…

数据结构:树的5种存储方案详解(C语言完整实现)

数据结构中的树结构常用来存储逻辑关系为 "一对多" 的数据。树结构可以细分为两类&#xff0c;分别是二叉树和非二叉树&#xff08;普通树&#xff09;&#xff0c;存储它们的方案是不一样的&#xff1a; 二叉树的存储方案有 2 种&#xff0c;既可以用顺序表存储二叉…

【蓝桥杯】 枚举和模拟练习题

系列文章目录 蓝桥杯例题 枚举和模拟 文章目录 系列文章目录前言一、好数&#xff1a; 题目参考&#xff1a;核心思想&#xff1a;代码实现&#xff1a; 二、艺术与篮球&#xff1a; 题目参考&#xff1a;核心思想&#xff1a;代码实现: 总结 前言 今天距离蓝桥杯还有13天&…

WebGL图形编程实战【3】:矩阵操控 × 从二维到三维的跨越

上一篇文章&#xff1a;WebGL图形编程实战【2】&#xff1a;动态着色 纹理贴图技术揭秘 仓库地址&#xff1a;github…、gitee… 矩阵操控 矩阵变换 回到前面关于平移缩放、旋转的例子当中&#xff0c;我们是通过改变传递进去的xy的值来改变的。 在进行基础变换的时候&…

如何把数据从SQLite迁移到PostgreSQL

## 如何把数据从SQLite迁移到PostgreSQL 文章目录 1、DB-Engines 中的SQLite 和 PostgreSQL2、SQLite安装和测试2.1、编译安装SQLite2.2、数据测试 3、Postgresql安装和测试3.1、编译安装postgresql3.2、测试 4、pgloader安装5、数据迁移和验证5.1、准备参数文件5.2、数据迁移…

Qt使用QGraphicsView绘制线路图————附带详细实现代码

文章目录 0 效果1 核心1.1 简单示例1.1.1 解读 1.2 创建用户交互1.2.1 完整示例 1.3 创建图形元1.3.1 绘制直线1.3.2 绘制贝塞尔曲线1.3.3 绘制图片 1.4 移动的小车 2 使用自定义视图类参考 0 效果 视图中包含线路、道岔、信号灯、火车。 下图为站点信号灯&#xff1a; 下图…

【Linux】调试器——gdb使用

目录 一、预备知识 二、常用指令 三、调试技巧 &#xff08;一&#xff09;监视变量的变化指令 watch &#xff08;二&#xff09;更改指定变量的值 set var 正文 一、预备知识 程序的发布形式有两种&#xff0c;debug和release模式&#xff0c;Linux gcc/g出来的二进制…

【数据分享】2000—2024年我国乡镇的逐年归一化植被指数(NDVI)数据(年最大值/Shp/Excel格式)

之前我们分享过2000-2024年我国逐年的归一化植被指数&#xff08;NDVI&#xff09;栅格数据&#xff0c;该逐年数据是取的当年月归一化植被指数&#xff08;NDVI&#xff09;的年最大值&#xff01;另外&#xff0c;我们基于此年度栅格数据按照行政区划取平均值&#xff0c;得到…