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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM