洛谷题单指南-集合-P5250 【深基17.例5】木材仓库

原题链接:https://www.luogu.com.cn/problem/P5250

题意解读:根据题目要求,需要一种数据结构,支持去重、排序、logN的查找,set是最合适的。

解题思路:

先回顾一下set的关键操作:

设set<int> s;

1、添加:s.insert(x)

2、查询个数:s.count(x)

3、查找第一个>=x的元素位置,返回迭代器:set<int>::iterator it = s.lower_bound(x)

   查找第一个>x的元素位置,返回迭代器:set<int>::iterator it = s.upper_bound(x)

   查找第==x的元素位置,返回迭代器:set<int>::iterator it = s.find(x)

  3.1、如果查找到的是第一个元素:it == s.begin()

  3.2、如果查找不到:it == s.end()

4、迭代器的操作:it++、it--、++it、--it,*it

5、删除迭代器指向的元素:s.erase(it)

6、元素个数:s.size()

7、遍历:

for(auto i : s) cout << i;

for(auto it = s.begin(); it != s.end(); it++) cout << *it;

for(set<int>::iterator it = s.begin(); it != s.end(); it++) cout << *it;

直接利用set的性质即可解决本题。

100分代码:

#include <bits/stdc++.h>
using namespace std;

set<int> s;
int n, op, len;

int main()
{
    cin >> n;
    while(n--)
    {
        cin >> op >> len;
        if(op == 1)
        {
            if(s.count(len)) cout << "Already Exist" << endl;
            else s.insert(len);
        }
        else if(op == 2)
        {
            if(!s.size())
            {
                cout << "Empty" << endl;
                continue;
            }
            set<int>::iterator it = s.lower_bound(len); //查找大于等于len的第一个数
            if(it == s.begin()) //如果是第一个元素
            {
                cout << *it << endl; 
                s.erase(it);
            } 
            else if(it == s.end()) //如果没有找到,取最后一个元素
            {
                cout << *(--it) << endl;
                s.erase(it);
            }
            else{ 
                int a = *it; //a是当前数
                int b = *(--it); //b是前一个数
                if(a - len < len - b) //当前数距离len更近
                {
                    cout << a << endl;
                    s.erase(++it);
                }
                else //前一个数距离len更近,或者两个数距离len一样
                {
                    cout << b << endl;
                    s.erase(it);
                }
            } 
        }
    }
}

 

posted @ 2024-03-21 08:52  五月江城  阅读(45)  评论(0编辑  收藏  举报