解题报告:这题很类似于杭电的一个题,http://acm.hdu.edu.cn/showproblem.php?pid=2037,今年暑假不AC,安排节目的,几乎是相同的题,做法是将所有的线段按照尾端点非递减排序,意思就是说尽量先选择靠前的线段,这是一种贪心的思想的体现,然后,逐一判断,只要当前的线段前端点在上一条线段的尾端点之后,那么这条线段就不去掉,否则这条线段不要。最后统计剩下多少条线段。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 using namespace std; 6 struct node { 7 int front,end; 8 }len[105]; 9 int visit[2000]; 10 bool cmp(node a,node b) { 11 return a.end < b.end; 12 } 13 14 int main() { 15 int n; 16 while(scanf("%d",&n)!=EOF) { 17 for(int i = 0;i<n;++i) { 18 scanf("%d%d",&len[i].front,&len[i].end); 19 if(len[i].front > len[i].end) 20 swap(len[i].front,len[i].end); 21 } 22 sort(len,len+n,cmp); 23 int ans = 0,m = -2000; 24 for(int i = 0;i<n;++i) 25 if(len[i].front >= m) { 26 ans++; 27 m = len[i].end; 28 } 29 printf("%d ",ans); 30 } 31 return 0; 32 }