CSES-1632 | Movie Festival II

CSES - 1632 Movie Festival II

    • 原题链接
    • 分析
    • 程序代码

原题链接

CSES - 1632 Movie Festival II

分析

这题需要用到贪心的策略,即先结束的电影先安排,这样才能看尽可能多的电影。这题可以归类为区间问题,先按照结束时间对区间进行升序排序。用大小为kmultiset维护电影的结束时间。区间遍历的过程中,找multiset中最大小于当前结束时间的元素,若找到,则可观看的电影数加一,同时更新multiset

程序代码

#include 
#include 
#include 
#include 
#include 
using namespace std;
 
typedef pair<int, int> PII;
 
bool cmp(PII a, PII b)
{
    if(a.second < b.second)  return true;
    else if(a.second > b.second)  return false;
    else {
        return a.first <= b.first;
    }
}
 
int main()
{
    int n, k;
    cin >> n >> k;
    vector<PII> v(n);
    int a, b;
    for(int i = 0; i < n; i++) {
        cin >> a >> b;
        v[i] = {a, b};
    }
    sort(v.begin(), v.end(), cmp);
    multiset<int> ms;
    for(int i = 0; i < k; i++) {
        ms.insert(0);
    }
    int res = 0;
    for(auto t : v) {
        // 返回一个迭代器,该迭代器指向刚好大于key的下一个元素
        // 若所有元素均大于key,返回begin()
        // 若所有元素均小于key,返回ms.end()
        auto it = ms.upper_bound(t.first);
        if( it == begin(ms) )  continue;
        ms.erase(--it);
        res++;
        ms.insert(t.second);
    }
    cout << res << endl;
    return 0;
}

你可能感兴趣的:(算法)