题目链接:
http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=14
题目描述:
学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排。
思路:
尽可能多的选取区间使得两两不相交。按照右端点排序,然后依次选取第一个右端点,然后除去与之相交的区间,选下一个右端点,重复如此。证明过程见算法竞赛入门经典P232
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 1e4 + ;
int T, n;
struct node
{
int x, y;
bool operator < (const node a)const
{
return y < a.y;
}
node(){}
node(double x, double y):x(x), y(y){}
};
node a[maxn];
int main()
{
cin >> T;
while(T--)
{
cin >> n;
for(int i = ; i < n; i++)
{
cin >> a[i].x >> a[i].y;
}
sort(a, a + n);
int time = , ans = ;
for(int i = ; i < n; i++)
{
if(a[i].x > time)
{
time = a[i].y;
ans++;
}
}
cout<<ans<<endl;
}
return ;
}