上链接:
P5250 【深基17.例5】木材仓库 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P5250上题干:
题目描述
博艾市有一个木材仓库,里面可以存储各种长度的木材,但是保证没有两个木材的长度是相同的。作为仓库负责人,你有时候会进货,有时候会出货,因此需要维护这个库存。有不超过 100000 条的操作:
- 进货,格式
1 Length
:在仓库中放入一根长度为 Length(不超过 109109) 的木材。如果已经有相同长度的木材那么输出Already Exist
。- 出货,格式
2 Length
:从仓库中取出长度为 Length 的木材。如果没有刚好长度的木材,取出仓库中存在的和要求长度最接近的木材。如果有多根木材符合要求,取出比较短的一根。输出取出的木材长度。如果仓库是空的,输出Empty
。输入格式
无
输出格式
无
输入输出样例
输入 #1复制
7 1 1 1 5 1 3 2 3 2 3 2 3 2 3输出 #1复制
3 1 5 Empty
这道题是一道能用set解决的简单题,我们首先介绍一些这道题用到的函数。
1.set.insert() 这个函数其实是有参数返回值的
它的参数是一个pair对
pair.first是 这个数插入的位置,也就是一个迭代器。
pair.second是一个bool值,代表是否插入成功。
所以如果我们要查看是否插入成功只需要访问 insert().second 即可
第二个函数:
set.erase()
用处是删除一个元素,或者一片元素
返回值只有1或0代表是否删除成功,如果没有这个数,说明删除失败,返回0;
第三个函数:
set.find()
用途是查找set中的元素。
返回值长这样:
可以看到它是一个迭代器,如果找到了,返回该元素的迭代器,如果没找到,返回end()
第四个函数
set.lower_bound
二分查找一个数,返回参数如下
可以看到返回的也是一个迭代器,只不过和find函数有所不同的是,
如果集合里面没有这个数字,我们就返回第一个大于等于这个数的迭代器,
倘若,查找的数字比现在集合中的所有数字都大,那么返回的就是end();
第五个函数,set.empty()
可以看出,它的返回值是一个bool类型,集合为空时返回1,否则返回0;
以上就是关于set的用法。
对于这道题,我们用这些函数完全可以完成。
int n, op, t;
set<int>::iterator kk, jj, pp;
set<int> s;
int main(){cin >> n;for (int i = 1;i <= n;i ++){cin >> op >> t;if (op == 1){if (!s.insert(t).second) cout << "Already Exist\n";}else {if (s.empty()){cout << "Empty\n";continue;}if (s.find(t) != s.end()) cout << t, s.erase(s.find(t));else {kk= jj = s.lower_bound(t);if (kk == s.begin()) cout << *kk, s.erase(kk);else if (kk == s.end()) cout << *(-- kk), s.erase(kk);else if (*kk - t < t - *(-- jj)) cout << *(kk), s.erase(kk);else cout << *(jj), s.erase(jj);}cout << endl;}}
}
当我们的程序运行到这里的时候:
无论进入不进入条件语句,我们的 j迭代器 都会-- ,所以接下来的else 我们直接输出它就好了。