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;
}`
分类:
set
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理