51nod 1133 不重叠的线段

题目链接:http://class.51nod.com/Challenge/Problem.html#problemId=1133

X轴上有N条线段,每条线段有1个起点S和终点E。最多能够选出多少条互不重叠的线段。(注:起点或终点重叠,不算重叠)。

例如:[1 5][2 3][3 6],可以选[2 3][3 6],这2条线段互不重叠。

输入

第1行:1个数N,线段的数量(2 <= N <= 10000)
第2 - N + 1行:每行2个数,线段的起点和终点(-10^9 <= S,E <= 10^9)

输出

输出最多可以选择的线段数量。

输入样例

3
1 5
2 3
3 6

输出样例

2


二、解题思路
根据我在草稿纸上随便话线段并找到规律:选结束早的线段比较好

三、代码
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm> 
 4 using namespace std;
 5 
 6 struct node{
 7     int start;//开始(输入) 
 8     int end;//结束(输入) 
 9 }a[100001];
10 
11 bool cmp(node x, node y){
12     return x.end < y.end;//结束早的在左边,结束晚的在右边 
13 }
14 
15 int main(){
16     int n, ans=0, r=-(1e9 + 2);//ans表示能选择几个,r表示可以选的范围的开始下标 
17     cin >> n;
18     for(int i = 0;i < n;i++){
19         cin >> a[i].start >> a[i].end;//输入 
20     }
21     sort(a,a+n,cmp);//按照什么时候结束来排序 
22     for(int i = 0;i < n;i++){
23         if(a[i].start >= r){//如果现在第i个线段没有和刚才选的那个线段重叠说明可以选 
24             r = a[i].end;//r为现在第i个线段结束的下标 
25             ans++;//选的线段的数量+1 
26         }
27     }
28     cout << ans << endl;
29     return 0;
30 }

 

posted @ 2020-04-26 16:03  elisa02  阅读(168)  评论(0编辑  收藏  举报