切长条
切长条
http://www.nowcoder.com/questionTerminal/65f5d447ef774cc692b537e76fe496b9
由于存在区间包含的关系,被包含的小区间满足时大区间也一定满足。
把所有区间按照右端点从大到小排序。
如果右端点相等,按照左端点从大到小排
不妨想想,取哪个点
由于右端点是从小到大,可以取最上面那个区间的右端点
1.如果后面区间的左端点小于该区间,那么就是包含,就一定取得到
2.如果后面区间的左端点大于该区间,依然被取到
此时取得的区间最多
#include <bits/stdc++.h> using namespace std; const int maxn=5e4+7; const int inf=0x3f3f3f3f; struct node { int x,y; }a[maxn]; bool cmp(node w,node q) { if (w.y==q.y) return w.x>q.x; return w.y<q.y; } int main() { int n; cin>>n; for (int i=0;i<n;++i) { cin>>a[i].x; int m; cin>>m; a[i].y=m+a[i].x; } sort(a,a+n,cmp); int r=a[0].y; int cnt=1; for (int i=1;i<n;++i) { if ((r-1)>=a[i].x&&(r-1)<=a[i].y)///判断1和2所包含的情况 { continue; } ++cnt; r=a[i].y;///更新 } cout<<cnt<<endl; return 0; }