解题思路:思路来源,但代码实现不同,他用结构体,我是用数组
1.将每个区间按右端点排序
2.将最小的右端点和下一个区间的左端点比较,若左端点小于右端点,说明两区间重合,只要在该右端点记一个人即可
3.若左端点大于右端点,说明两区间未重合,需要再记一个人,并且更新最小右端点为该区间的右端点
4.遍历所有区间
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
int** a = new int*[2];//利用二维数组来储存区间,其中第一行为左区间,第二行为右区间,上下一对为一个区间
for (int i = 0; i < 2; i++)
a[i] = new int[n];
for (int i = 0; i < n; i++)//把区间输入进去
{
cin >> a[0][i] >> a[1][i];
}
//插入排序,对二维数组的第二行进行排序,但第一二行元素位置改变,对应的第一行位置也改变
for (int i = 1; i < n; i++)
{
int e1 = a[0][i];
int e2 = a[1][i];
int j;
for (j = i - 1; j >= 0 && e2 < a[1][j]; j--)
{
a[1][j + 1] = a[1][j];
a[0][j + 1] = a[0][j];
}
a[1][j + 1] = e2;
a[0][j + 1] = e1;
}
//
int count = 1;
int min = a[1][0];
for (int i = 1; i < n; i++)
{
if (a[0][i] > min)//如果没有交集计数就加1
{
count++;
min = a[1][i];
}
}
cout << count;
//二维数组的销毁
for (int i = 0; i < 2; i++)
delete[]a[i];
delete[]a;
return 0;
}