#牛客春招刷题训练营# + 链接
通过优先选择结束时间最早且与前一个选定活动不冲突的活动,来最大化可以安排的活动数量。
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; }