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