题目描述
博艾市有一个木材仓库,里面可以存储各种长度的木材,但是保证没有两个木材的长度是相同的。作为仓库负责人,你有时候会进货,有时候会出货,因此需要维护这个库存。有不超过 100000 条的操作:
- 进货,格式
1 Length
:在仓库中放入一根长度为 Length(不超过 1e9) 的木材。如果已经有相同长度的木材那么输出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操作其跟map操作代码大同小异
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
int main(){
map<int,int> m;
int i,j,n,x,y;
cin >> n;
for (i=0; i<n; i++) {
cin >> x >> y;
if (x == 1) {
if (m.count(y)) cout << "Already Exist" << endl;
else m[y] = 1;
}
else {
if(m.empty()) cout << "Empty" << endl;
else if (m.count(y)) {
m.erase(y);
cout << y << endl;
}
else {
m[y] = 1; // 假装存一下该木头
auto it = m.find(y); // 指针定位
auto it2 = it;
it++;
// 几种特判
if (it2 == m.begin()) { // 没有比它短的
cout << it->first << endl;
m.erase(it);
}
else if (it == m.end()) { // 没有比它长的
cout << (--it2)->first << endl;
m.erase(it2);
}
// 长度比较
else if (y-(--it2)->first > it->first-y) {
cout << it->first << endl;
m.erase(it);
}
else {
cout << it2->first << endl;
m.erase(it2);
}
m.erase(y); // 删掉假装存的木头
}
}
}
return 0;
}