参考:
#7贪心法的条件和分析步骤 | C++算法基础系列 | 0基础小白都能看懂的算法教程,图解ACM算法_哔哩哔哩_bilibili
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 9;
struct node
{
int l;
int r;
}a[N];
int main()
{
int n;
cin >> n;
for(int i=1;i<=n;i++)
cin >> a[i].l >> a[i].r;
sort(a + 1, a + 1 + n, [](const node& a, const node& b)
{
return (a.r == b.r ? a.l < b.l : a.r < b.r);
}
);
int ans = 0, nowtime = 0;
for (int i = 1; i <= n; i++)
{
if (a[i].l < nowtime)continue; //如果该动画的左端点l小于当前时间则进行下一次循环(因为必定看不了)
else {
nowtime = a[i].r;
ans++;
}
}
cout << ans << endl;
return 0;
}
思路是贪心,排列时先去比较右端r,如果r相等,则选择l小的,若r不想等,则选择r小的。
优先选择右端r小的是因为r小,则后面能够选择的更多
而r相等,选择l小的是看完一整个动画后,遇到那种l=r的动画能选择。