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 }