#include <iostream>
#include <set>
#include<cstdio>
#include<algorithm>
const int maxn=100000+10;
struct P
{
int start,endness;
bool operator<(const P&s)
{
return endness<s.endness;
}
} p[maxn]; //最早结束时间。
//他可以同时记录K个节目,k个卡槽,一个如果结束播放,可以继续放这个里面放
std::multiset<int> se;
int main ()
{
int n,k;
std::multiset<int>::iterator it;
while(~scanf("%d%d",&n,&k))
{
se.clear();
for(int i=0; i<n; i++)
scanf("%d%d",&p[i].start,&p[i].endness);
std::sort(p,p+n);
for(int i=0; i<k; i++)
se.insert(0);//准备k个卡槽,记录每个的结束时间
int answer=0;
for(int i=0; i<n; i++)
{
it=se.upper_bound(p[i].start);//我们要找的是结束时间比我们要录制的节目的开始时间早一点或者相等的。
//如果找不到则返回end();(很恶心)
if(it==se.begin())//说明这里面没有一个可以放的
continue;
//如果没找到,即it=end();
it--;
se.erase(it);
se.insert(p[i].endness);
answer++;
}
printf("%d\n",answer);
}
return 0;
}
本文介绍了一个基于最早结束时间优先的节目录制调度算法实现。通过使用C++编程语言和标准模板库中的multiset数据结构,该算法能够高效地解决多个节目在有限数量的录制设备上的调度问题。
375

被折叠的 条评论
为什么被折叠?



