题目描述

Description

给定x轴上n个闭区间,去掉尽可能少的闭区间,使剩下的闭区间都不相交。

注意:这里,若区间与另一区间之间仅有端点是相同的,不算做区间相交。

例如,[1,2]和[2,3]算是不相交区间。

输入格式

第一行一个正整数n(n<=50),表示闭区间数。

接下来n行中,每行2个整数,表示闭区间的2个整数端点。

输出格式

输出去掉的最少的闭区间数。

输入样例

3

10 20

10 15

12 15

输出样例

2

提示

这个问题基本等同于书本的活动安排问题。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
using namespace std;
typedef struct section{
int start;
int end;
} Section;
int greedySelector(Section* sectionArr,int n){
int i,j;
int count = 1;
int current = 0;
Section tmp;
int length = n;
for (i = 0; i < length-1; i++){
for(j = i+1; j < length; j++){
if (sectionArr[i].end > sectionArr[j].end){
tmp = sectionArr[i];
sectionArr[i] = sectionArr[j];
sectionArr[j] = tmp;
}
}
}
for(i = 1; i < length; i++){
if (sectionArr[current].end <= sectionArr[i].start){
count++;
current = i;
}
}
return count;
}
int main() {
int n;
cin >> n;
Section* sectionArr = new Section[n];
for (int i = 0; i < n; i++){
cin >> sectionArr[i].start;
cin >> sectionArr[i].end;
}
cout << n-greedySelector(sectionArr,n) << endl;
delete []sectionArr;
return 0;
}