【洛谷P5250】木材仓库
今天还是在学map!
先来看一下题面
P5250 【深基17.例5】木材仓库
题目描述
博艾市有一个木材仓库,里面可以存储各种长度的木材,但是保证没有两个木材的长度是相同的。作为仓库负责人,你有时候会进货,有时候会出货,因此需要维护这个库存。有不超过 100000 条的操作:
- 进货,格式
1 Length:在仓库中放入一根长度为 Length(不超过 \(10^9\)) 的木材。如果已经有相同长度的木材那么输出Already Exist。 - 出货,格式
2 Length:从仓库中取出长度为 Length 的木材。如果没有刚好长度的木材,取出仓库中存在的和要求长度最接近的木材。如果有多根木材符合要求,取出比较短的一根。输出取出的木材长度。如果仓库是空的,输出Empty。
输入格式
无
输出格式
无
输入输出样例 #1
输入 #1
7
1 1
1 5
1 3
2 3
2 3
2 3
2 3
输出 #1
3
1
5
Empty
解法&&个人思考
这道题考察了一个随机插入删除的过程
又因为没有前后的顺序关系
而且用数组的话\(10^9\)会被卡
所以考虑万能的map!
下面我们先看代码 然后我会一一道来
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,opt,l;
map<int,int>q;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&opt,&l);
if(opt==1){
if(q.count(l)) cout<<"Already Exist"<<endl;
else q[l]=1;
}
if(opt==2){
if(q.empty()) cout<<"Empty"<<endl;
else if(q.count(l)){
q.erase(l);
cout<<l<<endl;
}
else{
q[l]=1;
auto st=q.find(l);
auto st_2=st;
st++;
if(st_2==q.begin()){
cout<<st->first<<endl;
q.erase(st);
}
else if(st==q.end()){
cout<<(--st_2)->first<<endl;
q.erase(st_2);
}
else if(l-(--st_2)->first>st->first-l){
cout<<st->first<<endl;
q.erase(st);
}
else{
cout<<st_2->first<<endl;
q.erase(st_2);
}
q.erase(l);
}
}
}
system("pause");
return 0;
}
map的相关函数我们在上期已经给出了
现在我们要介绍一个map的重要性质:
它是自动排序的!WOW!(曼波!)
那么要确定离它最近的值 就是附近的两个值了,好方便!
耶!
哦还有 auto是判断变量类型的声明函数 它会自动判断适合的变量类型呦
这里我们得到的是指针 然后例如st->first也就是st指针指向的map类型的第一变量
我们的思路是 假插入一个元素l 然后除掉l的相邻元素 最后删去l 这样就大功告成啦~
这题用平衡树应该也能做 但是还是要训练一下STL的嘛

浙公网安备 33010602011771号