本题为贪心区间
求最大可容纳活动数
贪心在于排序
本题与普通合并区间最大的区别是筛选区间
并不是简单将区间合并求最长区间
而是保证活动数最大
那么就要求每个区间尽可能的小
求出开始时间相同区间中结束最快的区间
所以要对数据按第一个数进行从小到大的排序
并筛去开始时间在这段时间内的区间
后统计还剩几个区间即为答案
模拟一下样例
[1,3]和[1,7]中[1,3]更短,筛去[1,7],保留[1,3]
[1,3]和[2,5]中2在[1,3]中,筛去[2,5],保留[1,3]
[1,3]和[4,6]中两数组可以兼容,均保留
故答案为2
附上代码
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
typedef pair<int,int> PII;
#define x first
#define y second
int n;
PII a[N];
//利用C++里的stl中的pair来储存,排序方便,也可以用二维数组或结构体
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);
//这里维护一个区间[l,r],将第一组数据放入
//因为刚开始就放入一个区间所以一定会有一个区间满足题目要求
//所以计数器从1开始
int cnt=1;
int l=a[0].x,r=a[0].y;
for(int i=0;i<n;i++){
//筛选区间,对能合并的区间就行筛选
if(a[i].x<r){
r=min(r,a[i].y);
}else{
//可以兼容计数器累加
//当出现新的可兼容区间时,前一个区间已经被处理到最优
//更新区间
cnt++;
l=a[i].x,r=a[i].y;
}
}
printf("%d",cnt);
return 0;
}