经典贪心算法: 最大不相交区间数量

C++

最大不相交区间数量

/*
最大不相交区间数量
题目描述:
	给定 N 个闭区间 [ai,bi],请你在数轴上选择若干区间,使得选中的区间之间互不相交(包括端点)。
	输出可选取区间的最大数量。
输入格式:
	第一行包含整数 N,表示区间数。
	接下来 N 行,每行包含两个整数 ai,bi,表示一个区间的两个端点。
输出格式
	输出一个整数,表示可选取区间的最大数量。
数据范围
	1 ≤ N ≤ 10^5,
	−10^9 ≤ ai ≤ bi ≤ 10^9

算法思路:
	和算法区间选点的思路一模一样。
	首先对区间按照 右端点为第二关键字,左端点为第一关键字进行从小到大进行排序(第二关键字必要不大)。
	然后,我们选择第一个区间,按照序号继续便利,直到找到一个与其不相交的区间,然后加入,直到便利所有的区间。
算法证明:
	该算法的证明可以通过替换法,我们可以一步步将任何一个最优解转换为算法计算出来的解。

 */
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;

typedef pair<int, int> PII;
const int N = 100010;
PII segments[N];
int n;

bool cmp(const PII &t1, const PII &t2) {
	return t1.second < t2.second;
}

int solution_one() {
	int cur_point = -2e9;
	int cnt = 0;

	sort(segments + 1, segments + 1 + n, cmp);
	for (int i = 1; i <= n; i ++ ) {
		if (segments[i].first > cur_point) {
			cnt += 1;
			cur_point = segments[i].second;
		}
	}
	return cnt;
}


int main()
{
	// input
	scanf("%d", &n);
	for (int i = 1; i <= n; i ++ ) {
		scanf("%d%d", &segments[i].first, &segments[i].second);
	}

	int res = solution_one();

	printf("%d\n", res);

	return 0;
}


posted @ 2022-07-14 21:29  lucky_light  阅读(344)  评论(0编辑  收藏  举报