本题为贪心区间

求最大可容纳活动数

贪心在于排序

本题与普通合并区间最大的区别是筛选区间

并不是简单将区间合并求最长区间

而是保证活动数最大

那么就要求每个区间尽可能的小

求出开始时间相同区间中结束最快的区间

所以要对数据按第一个数进行从小到大的排序

并筛去开始时间在这段时间内的区间

后统计还剩几个区间即为答案

模拟一下样例

[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;
}