51nod 1133 不重叠的线段

来源:互联网 发布:知乎 闲书 编辑:程序博客网 时间:2024/06/04 20:07

X轴上有N条线段,每条线段有1个起点S和终点E。最多能够选出多少条互不重叠的线段。(注:起点或终点重叠,不算重叠)。
例如:[1 5][2 3][3 6],可以选[2 3][3 6],这2条线段互不重叠。
Input
第1行:1个数N,线段的数量(2 <= N <= 10000)第2 - N + 1行:每行2个数,线段的起点和终点(-10^9 <= S,E <= 10^9)
Output
输出最多可以选择的线段数量。
Input示例
31 52 33 6
Output示例
2


woc我一开始用队列来写,发现记录了半天记录不出来就放弃了,换了写法,网上看到更厉害的代码就贴上来。

是个经典的贪心,这次排序是按照每条线段的末尾来排的。然后以一头就比较每个,然后更新这一头就行了。

代码如下:

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<queue>using namespace std;#define N 20010struct rng{    int st,ed;}a[N];int Max=1;int cmp(rng x,rng y){    return x.ed<y.ed?1:0;}priority_queue<int>s;int main(){    int i,j,n,m;    scanf("%d",&n);    for(i=1;i<=n;i++){        scanf("%d %d",&a[i].st,&a[i].ed);    }    sort(a+1,a+1+n,cmp);    int res=1;    for(i=2;i<=n;i++){        if(a[1].ed<=a[i].st){            res++;            a[1].ed=a[i].ed;        }    }    printf("%d\n",res);    return 0;}


1 0
原创粉丝点击