洛谷题单指南-集合-P5250 【深基17.例5】木材仓库
原题链接:https://www.luogu.com.cn/problem/P5250
题意解读:根据题目要求,需要一种数据结构,支持去重、排序、logN的查找,set是最合适的。
解题思路:
先回顾一下set的关键操作:
设set<int> s;
1、添加:s.insert(x)
2、查询个数:s.count(x)
3、查找第一个>=x的元素位置,返回迭代器:set<int>::iterator it = s.lower_bound(x)
查找第一个>x的元素位置,返回迭代器:set<int>::iterator it = s.upper_bound(x)
查找第==x的元素位置,返回迭代器:set<int>::iterator it = s.find(x)
3.1、如果查找到的是第一个元素:it == s.begin()
3.2、如果查找不到:it == s.end()
4、迭代器的操作:it++、it--、++it、--it,*it
5、删除迭代器指向的元素:s.erase(it)
6、元素个数:s.size()
7、遍历:
for(auto i : s) cout << i;
for(auto it = s.begin(); it != s.end(); it++) cout << *it;
for(set<int>::iterator it = s.begin(); it != s.end(); it++) cout << *it;
直接利用set的性质即可解决本题。
100分代码:
#include <bits/stdc++.h>
using namespace std;
set<int> s;
int n, op, len;
int main()
{
cin >> n;
while(n--)
{
cin >> op >> len;
if(op == 1)
{
if(s.count(len)) cout << "Already Exist" << endl;
else s.insert(len);
}
else if(op == 2)
{
if(!s.size())
{
cout << "Empty" << endl;
continue;
}
set<int>::iterator it = s.lower_bound(len); //查找大于等于len的第一个数
if(it == s.begin()) //如果是第一个元素
{
cout << *it << endl;
s.erase(it);
}
else if(it == s.end()) //如果没有找到,取最后一个元素
{
cout << *(--it) << endl;
s.erase(it);
}
else{
int a = *it; //a是当前数
int b = *(--it); //b是前一个数
if(a - len < len - b) //当前数距离len更近
{
cout << a << endl;
s.erase(++it);
}
else //前一个数距离len更近,或者两个数距离len一样
{
cout << b << endl;
s.erase(it);
}
}
}
}
}