![](https://i-blog.csdnimg.cn/blog_migrate/7cefdfd7dfb3dec6f4d02181b7cde1d5.png)
思路:
这道题让求区间覆盖,它要求只能一个一个的区间,先对n个区间进行排序,按照区间的结束点前后进行排序。所以从后往前看结束时间点,如果下一个的起点在前一个的结束点之后,则数量加1。
![](https://i-blog.csdnimg.cn/blog_migrate/7e043111664243d44a7f9ed9ff152ac1.png)
0402重做!AC!
#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>
#define x first
#define y second
using namespace std;
int n;
struct node{
int x,y;//记录开始结束结点
};
node a[1000010];
bool cmp(node a, node b){
return a.y < b.y;//按照结束结点从小到大
}
int cnt=1;//记录答案
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d",&a[i].x,&a[i].y);
}
sort(a,a+n,cmp);
int temp = a[0].y;
for(int i=1;i<n;i++){
if(a[i].x >= temp){
cnt++;
temp = a[i].y;
}
}
printf("%d",cnt);
return 0;
}
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{
int s,e;
};
node a[1000010];
int cnt=1;
int n;
bool cmp(node aa,node bb)
{
return aa.e<bb.e;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i].s>>a[i].e;
sort(a,a+n,cmp);
int p=a[0].e;//第一段不用看,从1开始加
for(int i=1;i<n;i++)
{
if(a[i].s >= p)
{
cnt++;
p=a[i].e;
}
}
cout<<cnt;
return 0;
}
结果:
![](https://i-blog.csdnimg.cn/blog_migrate/dd82e6b0eeb0c9a7b06e5614d106fedf.png)