洛谷P5250 【深基17.例5】木材仓库
【深基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的两个特殊情况:
- i指向s.begin()的位置,此时将j赋值为i(不动即可),此时的j就是我们要删除的位置,并记得在删除之前先输出一下
- i指向s.end()的位置,此时将j赋值为i-1的位置,就是set中最后一个元素的位置,此时j就是我们要出库的那根木材
- 如果i在中间的某一个位置,我们得判断i-1的位置和i的位置哪一个距离length更近,因为lower_bound只是能找出第一个≥length的位置,并不能直接判断上一个位置和找到的这个位置与检索的值哪一个距离更近,因此,我们先让j--,然后判断二者距离length的位置谁更近,如果i距离length更近,只需要将j重新赋值给i就行了
else {
j--;
if (*i - length < length - *j) j = i;
}
- 最后,记得输出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;
}
洛谷P5250 【深基17.例5】木材仓库的更多相关文章
- 【vector+pair】洛谷 P4715 【深基16.例1】淘汰赛
题目:P4715 [深基16.例1]淘汰赛 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这道题因为数据范围不大,所以做法可以非常简单,使用一个vector加上pair就可以了: ...
- 洛谷 P5706 【深基2.例8】再分肥宅水
题目连接: P5706 [深基2.例8]再分肥宅水 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 我提交的: 1 #include<iostream> 2 #inclu ...
- [CodePlus 2017 11月赛&洛谷P4058]木材 题解(二分答案)
[CodePlus 2017 11月赛&洛谷P4058]木材 Description 有 n棵树,初始时每棵树的高度为 Hi ,第 i棵树每月都会长高 Ai.现在有个木料长度总量为 S的订单, ...
- 2019.06.17课件:[洛谷P1310]表达式的值 题解
P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...
- 2018.07.17 洛谷P1368 工艺(最小表示法)
传送门 好的一道最小表示法的裸板,感觉跑起来贼快(写博客时评测速度洛谷第二),这里简单讲讲最小表示法的实现. 首先我们将数组复制一遍接到原数组队尾,然后维护左右指针分别表示两个即将进行比较的字符串的头 ...
- 洛谷P1214 [USACO1.4]等差数列 Arithmetic Progressions
P1214 [USACO1.4]等差数列 Arithmetic Progressions• o 156通过o 463提交• 题目提供者该用户不存在• 标签USACO• 难度普及+/提高 提交 讨论 题 ...
- 洛谷P1220 关路灯
洛谷1220 关路灯 题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关 ...
- 洛谷2583 地铁间谍 (UVa1025A Spy in the Metro)
洛谷2583 地铁间谍(UVa1025A Spy in the Metro) 本题地址:http://www.luogu.org/problem/show?pid=2583 题目描述 特工玛利亚被送到 ...
- 洛谷 P3410 拍照
洛谷 P3410 拍照 题目描述 小B有n个下属,现小B要带着一些下属让别人拍照. 有m个人,每个人都愿意付给小B一定钱让n个人中的一些人进行合影.如果这一些人没带齐那么就不能拍照,小B也不会得到钱. ...
- 洛谷 P4016负载平衡问题【费用流】题解+AC代码
洛谷 P4016负载平衡问题 P4014 分配问题[费用流]题解+AC代码 负载平衡问题 题目描述 GG 公司有n个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n ...
随机推荐
- 开箱即用的Live2d
安装 npm i @tomiaa/live2d 代码 <template> <div ref="live2dContentRef" id="live2d ...
- 蚁群算法及 TSP 问题上的应用
群智能(Swarm intelligence) 自然界动物群,称之为群. 群的特征: 相互作用的相邻个体的集合 个体的行为简单,既有竞争又有协作 智能化的集体行为(1+1>2): 个体间不仅能够 ...
- vue3.4的更新,保证你看的明明白白
defineModel 同学已经转正 defineModel 在vue3.3中还是一个实验性功能, 但是经过一个学期的努力,该同学已经转正. defineModel的简单介绍 defineModel( ...
- C语言:if(0)之后的语句真的不会执行吗?
C语言--if(0)之后的语句真的不会执行吗? 原文(有删改):https://www.cnblogs.com/CodeWorkerLiMing/p/14726960.html 前言 学过c语言的都知 ...
- 全国产RK3568J + FPGA的PCIe、FSPI通信实测数据分享!
测试数据汇总 案例 时钟频率 理论速率 测试结果 FSPI通信案例 150MHz 71.53MB/s 读速率:67.452MB/s 写速率:52.638MB/s PCIe通信案例 100MHz 803 ...
- 计算订单签收率的sql查询思路与过程(涉及百分比和四舍五入)
领导提出一个签收率需求,想要通过数据库达到excel中表现的形式,提高计算速度和工作效率, 如下形式: 数据库中表数据结构: 部分数据如下: sql语句思路如下: -- 1.已签收:以物流反馈管道,状 ...
- 汇编语言--cpu的工作原理(寄存器)--手稿
03
- 历代iPad及Android平板的主要参数对比
「程序员的备忘录系列」这笔记可是持续更新的哦 逻辑分辨率Point,也就是CSS像素,是进行网页适配的关键,以下是平时整理的一些备忘录数据,可以收藏. 以现在平板的销量,还没有手机的十分之一, ...
- Day 5 - 双指针与折半搜索
双指针 本页面将简要介绍双指针. 引入 双指针是一种简单而又灵活的技巧和思想,单独使用可以轻松解决一些特定问题,和其他算法结合也能发挥多样的用处. 双指针顾名思义,就是同时使用两个指针,在序列.链表结 ...
- 靶机练习: hacksudo---Thor
靶机:hacksudo---Thor 准备工作 靶机地址: http://download.vulnhub.com/hacksudo/hacksudo---Thor.zip MD5 校验:d12168 ...