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