一、算法分析
可以联系紫书上的,选择不相交的区间那一节。本题算法很直观,从贪心思想来说,我们希望选的线段尽量靠前而给后面的线段腾出空间,所以就要对线段的右边界排序。然后尽量往左挤。
二、代码如下
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
int n;
struct edge{
int from;
int to;
edge(int ff,int tt):from(ff),to(tt){}
};
vector<edge> a;
bool cmp(edge x1,edge x2){
return x1.to<x2.to;
}
int main(){
cin>>n;
int ed=0; //保存当前的右界
int ans=0;
int xx,yy;
for(int i=0;i<n;i++){
cin>>xx>>yy;
a.push_back(edge(xx,yy));
}
sort(a.begin(),a.end(),cmp);
for(int i=0;i<n;i++){
if(a[i].from>=ed){
ans++;
ed=a[i].to;
}
}
cout<<ans;
return 0;
}