洛谷P5250 【深基17.例5】木材仓库 题解

本文介绍了如何在编程中利用C++map数据结构解决题目中的去重、插入及按需删除操作,同时提到map的有序特性在二分查找中的应用。
摘要由CSDN通过智能技术生成
//我这一题是用map做的
//为啥要用map呢?
//首先题上说没有重复的木头,可以考虑map,因为map是去重的
//其次插入和删除木头可以用insert和erase实现
//并且删除木头时还需要最接近的,如果一样近删除最短的
//这种删除木头的操作可以用二分,非常巧的是map是有序的,还可以用二分函数
//所以我就用了map,当然set也是可以的,还有很多做法,但是我这个菜鸡就会一种
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
void solve(){
	int n;
	cin>>n;
	map<int,int>w;
	for(int i=1;i<=n;i++){
		int a,b;
		cin>>a>>b;
		//放入木材
		if(a==1){
			if(w.count(b))cout<<"Already Exist"<<endl;
			else w[b]=1;
		}else{//取出木材
			//判断map是否为空
			if(w.empty()){
				cout<<"Empty"<<endl;
				continue;
			}
			//如果木材存在
			if(w.count(b)){
				cout<<b<<endl;
				w.erase(b);
			}else{//木材不存在
				auto j=w.lower_bound(b);//二分去找
				if(j->first==b){
					cout<<b<<endl;
					w.erase(b);
				}else if(j==w.end()||j==w.begin()){//判断边界条件,以免段错误
					if(j==w.end()){
						j--;
						cout<<j->first<<endl;
					}else cout<<j->first<<endl;
					w.erase(j->first);
				}else{
					int v=j->first;
					j--;
					int vv=j->first;
					if(abs(vv-b)<abs(v-b)||abs(vv-b)==abs(v-b)){
						cout<<vv<<endl;
						w.erase(vv);
					}else{
						cout<<v<<endl;
						w.erase(v);
					}
				}
			}
		}
	}
}
int main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int _;
	//cin>>_;
	_=1;
	while(_--){
		solve();
	}
	return 0;
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值