题目链接 思路:对所有线段排序,每一次选取一条线段的条件是,情况一:当前线段的左端点大于最近已选的右端点并且当前右端点小于最近已选的左端点。情况二:当前左端点大于最近已选的右端点。
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <vector> #include <queue> #include <set> #include <map> using namespace std; typedef long long LL; const int MAXN = 10005; struct node{ int l, r; }a[MAXN]; bool cmp(node a, node b) { if(a.l!=b.l) return a.l<b.l; if(a.r!=b.r) return a.r<b.r; return false; } int main() { int n; while(~scanf("%d", &n)) { for(int i=1; i<=n; ++i) scanf("%d %d" ,&a[i].l,&a[i].r); sort(a+1,a+n+1,cmp); int ans=1, l=a[1].l, r=a[1].r; for(int i=2;i<=n;++i) { if(a[i].l!=l) { if(a[i].l>=r) { ans++; l=a[i].l,r=a[i].r; } else { if(a[i].r<=r) { r=a[i].r; l=a[i].l; } } } } printf("%d\n", ans); } return 0; }