Codeforces Beta Round #22 (Div. 2 Only) D. Segments(贪心)

 

题目大意

 

在 x 轴上,有 n(1<=n<=1000) 个线段,用最少的钉子把所有的线段钉住,输出这些钉子的坐标

 

做法分析

 

贪心

先把所有的线段按照起点由小到大排序,起点相同的按照终点由大到小排序

然后直接线性的扫一遍:不断的缩小钉子所在的区间,知道添加一条线段后,钉子所在的区间消失为止,然后,前面的所有的线段用一个钉子钉住,再接着往下扫,直到扫完了所有的线段

 

参考代码

 

D. Segments
 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <vector>
 5 #include <algorithm>
 6 
 7 using namespace std;
 8 
 9 struct data
10 {
11     int s, t;
12     bool operator <(const data &temp) const
13     {
14         if(s==temp.s) return t>temp.t;
15         return s<temp.s;
16     }
17 } seg[1006];
18 
19 int n;
20 vector <int> Dec;
21 
22 int deal(int id)
23 {
24     int End=seg[id].t;
25     for(int i=id+1; i<n; i++)
26     {
27         if(seg[i].s<=End && seg[i].t<End) End=seg[i].t;
28         if(seg[i].s>End)
29         {
30             Dec.push_back(seg[i-1].s);
31             return i-1;
32         }
33     }
34     Dec.push_back(seg[n-1].s);
35     return n-1;
36 }
37 
38 int main()
39 {
40     scanf("%d", &n);
41     for(int i=0; i<n; i++)
42     {
43         scanf("%d%d", &seg[i].s, &seg[i].t);
44         if(seg[i].s>seg[i].t) swap(seg[i].s, seg[i].t);
45     }
46     sort(seg, seg+n);
47     Dec.clear();
48     for(int i=0; i<n; i++)
49     {
50         i=deal(i);
51     }
52     n=(int)Dec.size();
53     printf("%d\n", n);
54     for(int i=0; i<n; i++)
55     {
56         printf("%d", Dec[i]);
57         if(i==n-1) printf("\n");
58         else printf(" ");
59     }
60     return 0;
61 }

 

题目链接 & AC通道

 

Codeforces Beta Round #22 (Div. 2 Only) D. Segments

 

 

 

posted @ 2013-04-21 20:14  jianzhang.zj  阅读(177)  评论(0编辑  收藏  举报