#牛客春招刷题训练营# + 链接
通过优先选择结束时间最早且与前一个选定活动不冲突的活动,来最大化可以安排的活动数量。
1.将所有活动按结束时间升序排序。
2.遍历每个活动,对于一个活动,如果它的开始时间晚于或等于上一个选中活动的结束时间,则安排此活动。
复杂度:时间复杂度O(nlogn),空间复杂度O(n)。
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
using PII = pair<int,int>;
const int MAXN=200010;
PII a[MAXN];
bool cmp(const PII& p, const PII& q) {
return p.second<q.second;
}
int main() {
int n;
scanf("%d", &n);
for (int i=1;i<=n;i++) {
scanf("%d%d", &a[i].first, &a[i].second);
}
sort(a+1,a+n+1,cmp);
int ans=0, pre=-1;
for (int i=1;i<=n;i++) {
if (a[i].first>=pre) {
++ans;
pre = a[i].second;
}
}
printf("%d\n", ans);
return 0;
}



京公网安备 11010502036488号