例题链接:https://vjudge.net/contest/236677#problem/D
题意:首先输入两个数字n,m。n表示有n张桌子,编号从1到n,m表示有m个操作, 然后接下来一行有n个数字,每个数字表示第i张桌子有ni张凳子, 接下来的m个操作里,每个操作有一个字符串str,加一个数字ch, 如果str==in,表示有ch个人的小队要坐下来,然后要我们找到凳子大于等于ch的ni值最小的然后编号最小的桌子(首先保证求所有大于等于ch里ni最小的数字,如果最小的ni有多个,取编号最小的),然后输出桌子编号,如果没有这样的桌子输出-1。当str==out时,表示做在编号为ch的桌子上的小队离开了,又可以坐人了。
这里看了其他的博客说要用set<pair<int,int> >(注意两个> >中间要加空格隔开),因为set会自动升序排列,然而这里每一个元素都是pair,它排列是先排pair里的first,再排second。比如说pair<2,3> pair<2,1> pair<0,6>排列之后是pair<0,6>,pair<2,1>,pair<2,3>。
介绍完排列规则,再自己看一下代码,理解一下就可以了。
#include<iostream> #include<cstring> #include<set> using namespace std; set<pair<int,int> >ss; set<pair<int,int> >::iterator it; int n,m,ch,num[100005]; char str[10]; int main() { while(cin>>n>>m) { for(int i=1;i<=n;i++) { cin>>num[i]; ss.insert(make_pair(num[i],i));//插入 } for(int i=1;i<=m;i++) { cin>>str>>ch; if(str[0]=='i') { it=ss.lower_bound(make_pair(ch,0));//找最小的 if(it==ss.end()) cout<<-1<<endl; else { cout<<it->second<<endl; ss.erase(it);//删除 } } else if(str[0]=='o') { ss.insert(make_pair(num[ch],ch)); } } } return 0; }