南阳OJ-14-会场安排问题---区间不相交

题目链接:

http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=14

题目描述:

学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排。

思路:

尽可能多的选取区间使得两两不相交。按照右端点排序,然后依次选取第一个右端点,然后除去与之相交的区间,选下一个右端点,重复如此。证明过程见算法竞赛入门经典P232

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 const int maxn = 1e4 + 10;
 8 int T, n;
 9 struct node
10 {
11     int x, y;
12     bool operator < (const node a)const
13     {
14         return y < a.y;
15     }
16     node(){}
17     node(double x, double y):x(x), y(y){}
18 };
19 node a[maxn];
20 int main()
21 {
22     cin >> T;
23     while(T--)
24     {
25         cin >> n;
26         for(int i = 0; i < n; i++)
27         {
28             cin >> a[i].x >> a[i].y;
29         }
30         sort(a, a + n);
31         int time = 0, ans = 0;
32         for(int i = 0; i < n; i++)
33         {
34             if(a[i].x > time)
35             {
36                 time = a[i].y;
37                 ans++;
38             }
39         }
40         cout<<ans<<endl;
41     }
42     return 0;
43 }

 

posted @ 2018-03-31 20:32  _努力努力再努力x  阅读(174)  评论(0编辑  收藏  举报