其他分享
首页 > 其他分享> > E - Entertainment Box

E - Entertainment Box

作者:互联网


这道题算是活动选择的plus版本,限定了有几个卡槽,一样是用贪心的思想做,但是存数得用一个可以自动排序的数据结构存储,而且还得必须找出当前活动能否排在已经排好的活动后,也就是
说寻找第一个大于将要插入活动的开始时间的活动。
用multiset
multiset默认按升序排列,自带upper_bound()函数,相当于二分查找,与set不同的是,multiset可以存储多个不同的值,故而使用multiset

#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
#define IOS ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
const int N = 1e5 + 10;
struct node
{
    int be, en;
    bool operator <(const node a)const
    {
        return en < a.en;
    }
}t[N];

int main()
{
    IOS;
    int n, k;
    cin >> n >> k;
    for(int i = 1; i <= n; i++)
    cin >> t[i].be >> t[i].en;
    sort(t + 1, t + n + 1);
    
    multiset<int> se;
    multiset<int>::iterator it;
    for(int i = 0; i < k; i++)
    se.insert(0);

    int res = 0;
    for(int i = 1; i <= n; i++)
    {
        it = se.upper_bound(t[i].be);
        if(it == se.begin())//如果找到的数的位置为起点,说明数不存在
        continue;
        it--;
        se.erase(it);
        se.insert(t[i].en);
        res++;
    }
    cout << res << endl;
    return 0;
}

标签:Box,en,Entertainment,int,tie,multiset,include,se
来源: https://www.cnblogs.com/Flying-bullet/p/16278393.html