其实o(n^2)的算法很好想,但o(n)就比较狗了。主要思路就是两个变量f1,f2,假设取这两个点。剩下看代码。
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct node{ int a; int b; }; node m[1000]; bool cmp(node a,node b) //头从小到大排序 { if(a.a != b.a) { return a.a < b.a; } else return a.b < b.b; } int main() { int n,f1,f2,tot = 0; cin>>n; for(int i = 1;i <= n;i++) { cin>>m[i].a>>m[i].b; } sort(m + 1,m + n + 1,cmp); f1 = m[n].a; f2 = m[n].a + 1; tot += 2; for(int i = n - 1;i > 0;i--) { if(m[i].b < f1) //两区间分离,则同时改变f1,f2,f1 = 头;f2 = 头+1; { tot += 2; f1 = m[i].a; f2 = f1 + 1; } else if(m[i].b < f2) //两区间重合,f2 = 原来的f1,f1 = 现在区间的头 { tot ++; f2 = f1; f1 = m[i].a; } } cout<<tot<<endl; return 0; } /* 4 3 6 2 4 0 2 4 7 */
转载于:https://www.cnblogs.com/DukeLv/p/8587151.html
