51nod 1133 不重叠的线段 贪心

来源:互联网 发布:c语言flag的用法 编辑:程序博客网 时间:2024/05/22 17:05

题目链接
思路:对所有线段排序,每一次选取一条线段的条件是,情况一:当前线段的左端点大于最近已选的右端点并且当前右端点小于最近已选的左端点。情况二:当前左端点大于最近已选的右端点。

#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;}