题目传送门
思路:
我们从这句话:“如果已经有相同长度的木材那么输出Already Exist
。”可以看出,本题是需要去重的,从“如果没有刚好长度的木材,取出仓库中存在的和要求长度最接近的木材。”可以看出,本题是需要排序的,那么既去重又排序的数据结构就是set了。
set<int> m;
我们再分别看看1和2的情况。
1的情况:
我们先来判断有没有重复:
if(find(m.begin(),m.end(),b)!=m.end())cout<<"Already Exist"<<endl;
如果没有重复,就把它插入进来:
else m.insert(b);
2的情况:
先来判断是否为(空这就是很多代码RE的原因):
if(m.empty()){
cout<<"Empty"<<endl;
continue;
}
我们再来看看有这个数的情况:
else{
cout<<b<<endl;
m.erase(b);
}
再来看看没有这个数的情况 :
if(find(m.begin(),m.end(),b)==m.end()){
}
没有这个数的情况中,我们还要特判没有比它大的书和没有比它小的数的情况(这也是RE的一大原因) :
auto uit=upper_bound(m.begin(),m.end(),b);
if(uit==m.end()){
uit--;
cout<<*uit<<endl;
m.erase(*uit);
continue;
}if(uit==m.begin()){
cout<<*uit<<endl;
m.erase(*uit);
continue;
}
最后,我们要在用一个变量存一下第一个比它小的数,最后再比较一下就结束啦。
auto lit=--uit;
uit++;
if(abs(*lit-b)<=abs(*uit-b)){
cout<<*lit<<endl;
m.erase(*lit);
}else{
cout<<*uit<<endl;
m.erase(*uit);
}
完整代码:
#include<iostream>
#include<cmath>
#include<algorithm>
#include<set>
using namespace std;
set<int> m;
int n,a,b;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a>>b;
if(a==1){
if(find(m.begin(),m.end(),b)!=m.end())cout<<"Already Exist"<<endl;
else m.insert(b);
}if(a==2){
if(m.empty()){
cout<<"Empty"<<endl;
continue;
}
if(find(m.begin(),m.end(),b)==m.end()){
auto uit=upper_bound(m.begin(),m.end(),b);
if(uit==m.end()){
uit--;
cout<<*uit<<endl;
m.erase(*uit);
continue;
}if(uit==m.begin()){
cout<<*uit<<endl;
m.erase(*uit);
continue;
}auto lit=--uit;
uit++;
if(abs(*lit-b)<=abs(*uit-b)){
cout<<*lit<<endl;
m.erase(*lit);
}else{
cout<<*uit<<endl;
m.erase(*uit);
}
}else{
cout<<b<<endl;
m.erase(b);
}
}
}
return 0;
}