题目描述
设有 个活动的集合 ={1,2,..,}E={1,2,..,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动 i 都有一个要求使用该资源的起始时间 si 和一个结束时间 fi,且 <si<fi。如果选择了活动 i ,则它在时间区间 [,)[si,fi) 内占用资源。若区间 [,[si,fi) 与区间 [,)[sj,fj) 不相交,则称活动 i 与活动 j 是相容的。也就是说,当 ≤fi≤sj 或 ≤fj≤si 时,活动 i 与活动 j 相容。选择出由互相兼容的活动组成的最大集合。
输入格式
第一行一个整数 n;
接下来的 n 行,每行两个整数 si 和 fi。
输出格式
输出互相兼容的最大活动个数。
样例
4
1 3
4 6
2 5
1 7
2
对活动排序,活动结束时间从小到大排序,活动结束时间相同的开始时间短的优先,可以尽可能安排多的活动
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
class line {
public:int start;
int end;
};
const int N = 1010;
bool cmp(line a, line b){
if (a.end != b.end) {
return a.end < b.end;
}
else if (a.start != b.start) {
return a.start < b.start;
};
};
int main() {
int n;
cin >> n;
line* a = new line[N];
for (int i = 1; i <= n; i++) {
cin >> a[i].start >> a[i].end;
};
sort(a + 1, a + n + 1, cmp);
int flag = 1;
int res = 1;
for (int i = 1; i <= n; i++) {
if (a[i].start >= a[flag].end) {
flag = i;
res++;
};
};
cout << res << endl;
return 0;
};
ac了