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