E - Entertainment Box Gym - 100781E


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

猜你喜欢

转载自blog.csdn.net/zhangzhenjunaixuxin/article/details/81348019