《洛谷深入浅出基础篇》 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() 这个函数其实是有参数返回值的

它的参数是一个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 我们直接输出它就好了

  • 23
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

louisdlee.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值