洛谷P5250 【深基17.例5】木材仓库
1.洛谷P5707 【深基2.例12】上学迟到2.洛谷P5710 【深基3.例2】数的性质3.洛谷P1914 小书童——凯撒密码4.洛谷P1047 [NOIP2005 普及组]校门外的树5.洛谷P5728 【深基5.例5】旗鼓相当的对手6.洛谷P5721 【深基4.例6】数字直角三角形7.洛谷[NOIP2015 普及组] 金币8.洛谷[NOIP2011 普及组]数字反转9.洛谷P4956 [COCI2017-2018#6] Davor10.洛谷B3843 [GESP202306 三级]密码合规11.洛谷P1601 A+B Problem(高精度加法)12.洛谷P1614 爱与愁的心痛(滑动窗口解法)13.洛谷P2670 [NOIP2015 普及组] 扫雷游戏14.洛谷P1563 [NOIP2016 提高组] 玩具谜题15.洛谷B3849 [GESP样题 三级] 进制转换16.洛谷P1100 高低位交换17.洛谷P1143 进制转换18.[NOIP2008 提高组] 笨小猴(洛谷题号P1125)19.洛谷[NOIP2015 普及组] 金币20.洛谷P3383 【模板】线性筛素数21.洛谷P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题22.洛谷B3940 [GESP样题 四级] 填幻方23.洛谷P1042 [NOIP2003 普及组] 乒乓球24.洛谷P1067 [NOIP2009 普及组] 多项式输出25.洛谷P1098 [NOIP2007 提高组] 字符串的展开26.洛谷P1842 [USACO05NOV] 奶牛玩杂技27.洛谷P1223 排队接水28.洛谷P1209修理牛棚 Barn Repair
29.洛谷P5250 【深基17.例5】木材仓库
30.洛谷P1226 【模板】快速幂31.洛谷P1480 A/B Problem32.洛谷P1786 帮贡排序33.双指针习题:Kalindrome Array【深基17.例5】木材仓库
题目描述
博艾市有一个木材仓库,里面可以存储各种长度的木材,但是保证没有两个木材的长度是相同的。作为仓库负责人,你有时候会进货,有时候会出货,因此需要维护这个库存。有不超过 100000 条的操作:
- 进货,格式
1 Length
:在仓库中放入一根长度为 Length(不超过 ) 的木材。如果已经有相同长度的木材那么输出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; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战