set<pair<int,int> >的用法

本文介绍了一种使用C++标准模板库Set来解决桌凳分配问题的方法。该问题涉及处理一系列顾客就座和离座的操作,通过查找并更新满足条件的桌子信息。Set的自动排序特性使得能够高效地找到合适的桌子。

例题链接: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;
}

 

转载于:https://www.cnblogs.com/6262369sss/p/9272107.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值