首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

洛谷P5250 【深基17.例5】木材仓库

编程知识
2024年08月06日 20:35

【深基17.例5】木材仓库

题目描述

博艾市有一个木材仓库,里面可以存储各种长度的木材,但是保证没有两个木材的长度是相同的。作为仓库负责人,你有时候会进货,有时候会出货,因此需要维护这个库存。有不超过 100000 条的操作:

  • 进货,格式1 Length:在仓库中放入一根长度为 Length(不超过 \(10^9\)) 的木材。如果已经有相同长度的木材那么输出Already Exist
  • 出货,格式2 Length:从仓库中取出长度为 Length 的木材。如果没有刚好长度的木材,取出仓库中存在的和要求长度最接近的木材。如果有多根木材符合要求,取出比较短的一根。输出取出的木材长度。如果仓库是空的,输出Empty

输入格式

输出格式

样例 #1

样例输入 #1

7
1 1
1 5
1 3
2 3
2 3
2 3
2 3

样例输出 #1

3
1
5
Empty

思路:

  • 这题我们观察到要快速查找仓库中是否存在length长度的木材,而且还要让长度为length的木材出库,有这两个特性我们会自然而然的想到set,能够快速检索,并且还能快速删除集合中的某一个元素。
  • 首先,我们定义一个set,然后循环n次操作,如果x==1的话,我们就查找,查到了就输出Already Exist,并换行。否则,就进入x=2的逻辑,先判断set是否为空,为空我们就输出empty,否则我们就利用lower_bound来查找到第一个大于等于length的位置
  • 让指针i指向set中第一个≥length的位置,先让指针j与指针i指向相同的位置。并且判断i的两个特殊情况:
  1. i指向s.begin()的位置,此时将j赋值为i(不动即可),此时的j就是我们要删除的位置,并记得在删除之前先输出一下
  2. i指向s.end()的位置,此时将j赋值为i-1的位置,就是set中最后一个元素的位置,此时j就是我们要出库的那根木材
  3. 如果i在中间的某一个位置,我们得判断i-1的位置和i的位置哪一个距离length更近,因为lower_bound只是能找出第一个≥length的位置,并不能直接判断上一个位置和找到的这个位置与检索的值哪一个距离更近,因此,我们先让j--,然后判断二者距离length的位置谁更近,如果i距离length更近,只需要将j重新赋值给i就行了
				else {
					j--;
					if (*i - length < length - *j) j = i;
				}
  1. 最后,记得输出j所指向的位置,并在集合中删除j指向的元素即可
				cout << *j << endl;
				//这里可以写*j,也可以只写j,只写j表明删除j这个迭代器所对应的位置,写*j表明删除j所指向的这个元素
				s.erase(*j);

代码:

#include<set>
#include<iostream>
using namespace std;
int n;
int x, length;
set<int> s;
int main()
{
	cin >> n;
	while (n--) {
		cin >> x >> length;
		if (x == 1) {
			if (s.find(length) == s.end()) s.insert(length);
			else cout << "Already Exist" << endl;
		}
		else if (x == 2) {
			if (s.empty()) cout << "Empty" << endl;
			else {
				auto i = lower_bound(s.begin(),s.end(), length);
				auto j = i;
				if (i == s.begin()) j = i;
				else if (i == s.end()) {
					i--; j = i;
				}
				else {
					j--;
					if (*i - length < length - *j) j = i;
				}
				cout << *j << endl;
				s.erase(*j);
			}
		}
	}
	return 0;
}
From:https://www.cnblogs.com/Tomorrowland/p/18346038
本文地址: http://shuzixingkong.net/article/856
0评论
提交 加载更多评论
其他文章 JavaWeb中的Tomcat,Servlet详解
JavaWeb JavaWeb技术主要包括服务器技术(后端),如Tomcat,Servlet,JSP等待,以及客户端技术(前端)如HTML,CSS,JavaScript等等 Web服务器 Web服务器主要负责处理客户端发出的HTTP请求,并做出相应回应 Web服务器:安装了服务器软件的计算机,只用于
JavaWeb中的Tomcat,Servlet详解 JavaWeb中的Tomcat,Servlet详解 JavaWeb中的Tomcat,Servlet详解
英语简单句
五种基本简单句: 陈述句 疑问句 祈使句 感叹句 简单句1 疑问句1.1 一般疑问句 概念: 用“yes”或“no”来回答的句子. 结构: [系动词be/助动词/情态动词 主语 谓语?]1.2 特殊疑问句 概念: 以疑问词开头,对句中某一成分提问的句子叫特殊疑问句。常用的疑问词有:what who
Jmeter SHA512接口加密测试
前言:最近,我遇到一些测试接口必须传入经过SHA512加密后的sign签名,并且签名有1小时时间限制,即签名不是一成不变超1小时就会过期,这导致在测试过程中就得频繁手工去更新签名。其实Jmeter是有提供函数去进行自动转换的,以下详解 SHA512加密,可以去网上搜索SHA512在线转换 1、已知,
Jmeter SHA512接口加密测试 Jmeter SHA512接口加密测试 Jmeter SHA512接口加密测试
【Spring源码分析】Spring Scope功能中的动态代理 - Scoped Proxy
本文基于Springboot 3.3.2及Springcloud 2023.0.1版本编写。 Spring Scoped Proxy是什么 在使用Spring cloud配置中心动态配置更新功能时,笔者发现在给一个类加上@RefreshScope注解后,其中@Value注入的字段会被自动更新。起初笔
爬虫简易说明
想必大家都了解爬虫,也就是爬取网页你所需要的信息 相比于网页繁多的爬虫教程,本篇主要将爬虫分为四个部分,以便你清楚,代码的功能以及使用,这四部分分别为 1.获取到源代码 2.根据网页中的标签特征,获取源代码你所需要的部分 3.想一下如何根据页面的逻辑将一系列的网页自动化抓取 4.保存数据在xlsx等
数据结构学习之树结构
前段时间刚好在学习机器学习中的决策树,想起多年前学习树这个数据结构的场景,刚好借此机会回归一下知识点。 树是一种非常常见的数据结构,它由节点(Node)和边(Edge)构成。它有如下的一些特征: 1. 根结点(Root Node):树有且只有一个根结点,它是树的顶端结点。 2. 结点(Node):每
ffmpeg和ffplay常用指令
FFmpeg 常见用法 1. 基本命令结构 ffmpeg [global_options] -i input_file [input_options] output_file [output_options] 2. 将其它格式图片转换为 YUV420p ffmpeg -i input.jpg -pi
c#12 实验特性Interceptor如何使用的一个简单但完整的示例
一直有很多转载dotnet对Interceptor说明文档的,但鲜有说明Interceptor如何使用的,这里写一篇简单示例来展示一下 c# 12 实验特性Interceptor 是什么? 官方解释如下(其实简单说就是语言特性中内置的静态编织方式的aop功能,不同于其他il修改代码的方式,使用上得结