Codeforces Beta Round #22 (Div. 2 Only) D. Segments(贪心)
题目大意
在 x 轴上,有 n(1<=n<=1000) 个线段,用最少的钉子把所有的线段钉住,输出这些钉子的坐标
做法分析
贪心
先把所有的线段按照起点由小到大排序,起点相同的按照终点由大到小排序
然后直接线性的扫一遍:不断的缩小钉子所在的区间,知道添加一条线段后,钉子所在的区间消失为止,然后,前面的所有的线段用一个钉子钉住,再接着往下扫,直到扫完了所有的线段
参考代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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