P5250 【深基17.例5】木材仓库(set)


由于题目保证木材的长度互不相同所以很自然的想到要用set
op=1时
使用find函数查找length
如果it==s.end(),说明仓库里没有该长度的木材,应该insert
反之输出“Already Exist”

op=2时
使用lower_bound 函数查找第一个大于等于length的木材,如果*it=length说明该仓库中有与length相同的木材,直接输出就行。
反之我们就要查看it的位置,如果it=s.end()说明该仓库中没有比length大的木材,让it--,输出仓库中最大的就行的了,如果it=s.begin(),说明仓库中的的所有木材都比length长,输出最小的一个
如果以上都不是的话,说明仓库中既有比length长的又有比length小的,直接比较it与it--两个位置上的木材与length的差的大小,然后选取差小的,如果相等就选长度小的
每次取出木材时记得erase迭代器

`#include<iostream>
#include<set>
#define int long long
using namespace std;
signed main() {
	set<int>s;
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		int op;
		cin >> op;
		if (op == 1) {
			int length;
			cin >> length;
			auto it=s.find(length);
			if (it == s.end())s.insert(length);
			else cout << "Already Exist" << endl;
		}
		if (op == 2) {
			int length;
			cin >> length;
			if (s.empty())cout << "Empty" << endl;
			else {
				auto it = s.lower_bound(length);
				if (*it == length)cout<<*it<<endl,s.erase(it);
				else if (it == s.end()) {
					it--;
					cout << *it << endl;
					s.erase(it);
				}
				else if (it == s.begin()) {
					cout << *it << endl;
					s.erase(it);
				}
				else {
					auto temp = it;
					int cha1 = *it - length;
					auto a1 = --it;
					int cha2 = length - *a1;
					if (cha1 == cha2)cout << *a1 << endl,s.erase(a1);
					else if(cha1<cha2)cout << *temp << endl,s.erase(temp);
					else if(cha2<cha1)cout << *a1 << endl, s.erase(a1);
				}
				
				
				
			}
		}
	}
	return 0;
}`
posted @   郭轩均  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示