P1803 凌乱的yyy / 线段覆盖

题目链接:P1803

Describe:

现在各大 oj 上有 nnn 个比赛,每个比赛的开始、结束的时间点是知道的。

yyy 认为,参加越多的比赛,noip 就能考的越好(假的)。

所以,他想知道他最多能参加几个比赛。

由于 yyy 是蒟蒻,如果要参加一个比赛必须善始善终,而且不能同时参加 222 个及以上的比赛。

Input:
第一行是一个整数 nnn ,接下来 nnn 行每行是 222 个整数 ai,bia_{i},b_{i}ai​,bi​ ( ai<bia_{i}<b_{i}ai​<bi​ ),表示比赛开始、结束的时间。
Output:
一个整数最多参加的比赛数目。
Sample Input:
3
0 2
2 4
1 3
Sample Output:
2

解题思路:

排序时要按每个比赛结束时间排增序,这样保证,选择那个比赛,结束时间都是一样的,对后面不产生影响,不然贪心策略可能不成立。

AC代码:

 

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 struct node
 5 {
 6     int st,ed;
 7     bool operator < (const node &tmp) const
 8     {
 9         if(ed == tmp.ed) return st < tmp.st;
10         else return ed < tmp.ed;
11     }
12 } a[1000010]; // 结构体数组记录开始结束时间
13 int main()
14 {
15     int n,x,y,s,cnt;
16     cnt = 0; // 记录参加比赛数
17     s = 0; // 记录时间点,初始化为零
18     cin >> n;
19     for(int i = 0; i < n ;i++)
20         cin >> a[i].st >> a[i].ed;
21     sort(a,a+n); // 排序
22     for(int i = 0; i < n; i++)
23     {
24         if(a[i].st >= s) // 如果当前开始时间点合适,就选择该比赛
25         {
26             s = a[i].ed;
27             cnt++;
28         }
29     }
30     cout << cnt;
31     return 0;
32 }

 

上一篇:cad.net dll动态加载,在一个dll查找引用了的dll,查找dll依赖.dll热插拔,加载dll运行出错


下一篇:2018NOIP提高组Day1(铺设道路&货币系统&赛道修建)