本文主要是介绍CSES-1632 | Movie Festival II,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
CSES - 1632 Movie Festival II
- 原题链接
- 分析
- 程序代码
原题链接
CSES - 1632 Movie Festival II
分析
这题需要用到贪心的策略,即先结束的电影先安排,这样才能看尽可能多的电影。这题可以归类为区间问题,先按照结束时间对区间进行升序排序。用大小为k
的multiset
维护电影的结束时间。区间遍历的过程中,找multiset
中最大小于当前结束时间的元素,若找到,则可观看的电影数加一,同时更新multiset
。
程序代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <set>
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;
}
这篇关于CSES-1632 | Movie Festival II的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!