《洛谷深入浅出基础篇》 P5250 木材仓库————集合应用实例

上链接:

P5250 【深基17.例5】木材仓库 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N7T8https://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() 这个函数其实是有参数返回值的

《洛谷深入浅出基础篇》 P5250 木材仓库————集合应用实例_第1张图片

它的参数是一个pair对

pair.first是   这个数插入的位置,也就是一个迭代器。

pair.second是一个bool值,代表是否插入成功。

所以如果我们要查看是否插入成功只需要访问 insert().second 即可

《洛谷深入浅出基础篇》 P5250 木材仓库————集合应用实例_第2张图片

 

第二个函数:

set.erase()

用处是删除一个元素,或者一片元素

返回值只有1或0代表是否删除成功,如果没有这个数,说明删除失败,返回0;

《洛谷深入浅出基础篇》 P5250 木材仓库————集合应用实例_第3张图片

第三个函数:

set.find()

用途是查找set中的元素。

返回值长这样:

《洛谷深入浅出基础篇》 P5250 木材仓库————集合应用实例_第4张图片

可以看到它是一个迭代器,如果找到了,返回该元素的迭代器,如果没找到,返回end()

第四个函数

set.lower_bound 

二分查找一个数,返回参数如下

《洛谷深入浅出基础篇》 P5250 木材仓库————集合应用实例_第5张图片

可以看到返回的也是一个迭代器,只不过和find函数有所不同的是,

如果集合里面没有这个数字,我们就返回第一个大于等于这个数的迭代器,

倘若,查找的数字比现在集合中的所有数字都大,那么返回的就是end(); 

《洛谷深入浅出基础篇》 P5250 木材仓库————集合应用实例_第6张图片 

第五个函数,set.empty() 

《洛谷深入浅出基础篇》 P5250 木材仓库————集合应用实例_第7张图片

可以看出,它的返回值是一个bool类型,集合为空时返回1,否则返回0; 

《洛谷深入浅出基础篇》 P5250 木材仓库————集合应用实例_第8张图片

以上就是关于set的用法。

对于这道题,我们用这些函数完全可以完成。

 

int n, op, t;
set::iterator kk, jj, pp;
set 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;
		}
	}
}

当我们的程序运行到这里的时候:

《洛谷深入浅出基础篇》 P5250 木材仓库————集合应用实例_第9张图片

无论进入不进入条件语句,我们的 j迭代器 都会-- ,所以接下来的else 我们直接输出它就好了

你可能感兴趣的:(洛谷深入浅出基础篇,c++,数据结构)