zoukankan      html  css  js  c++  java
  • set<pair<int,int> >的用法

    例题链接: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;
    }
  • 相关阅读:
    小程序 视频
    b161: NOIP2007 4.Hanoi双塔问题
    命名规则、.gitignore、freopen()
    c++学习记录(九)
    c++学习笔记(八)
    2020面向对象程序设计寒假作业2
    c++学习记录(七)
    c++学习记录(六)
    c+学习记录(五)
    c++学习记录(四)
  • 原文地址:https://www.cnblogs.com/6262369sss/p/9272107.html
Copyright © 2011-2022 走看看