贪心法的应用(2) 区间交集问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/alex1997222/article/details/86309616

问题描述:

给出N个开区间(X,Y),从中选择尽可能多的开区间,使得这些开区间两两之间没有交集

例如对开区间(1,3),(2,4),(3,5),(6,7)来说,可以选出最多3个区间(1,3),(3,5),(6,7)

思路:

首先对区间进行排序,将x较小的区间排在前面,因为如图a所示,区间越小,所能容纳的空间就越大

排序完成后,从最小的区间的下一区间开始,依次比较下一区间的x是否大于上一区间的y,如果成立,则说明它们不相交

然后把下一区间设置为当前区间,依次与接下来的区间比较,观察是否相交即可。

#include <iostream>
#include <algorithm>
#include <string>
#include <string.h>
using namespace std;
struct Interval
{
	int x, y;
}Intervals[1001];
bool cmp(Interval a, Interval b) {
	if (a.x != b.x) return a.x < b.x;
	else return a.y < b.y;
}
int main() {
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; ++i) {
		scanf("%d %d", &Intervals[i].x, &Intervals[i].y);
	}
	int ans = 1;
	int lastY = Intervals[0].y;
	for (int i = 1; i < n; ++i) {
		if (Intervals[i].x >= lastY) {
			lastY = Intervals[i].y;
			ans++;
		}
	}
	printf("%d", ans);
	system("PAUSE");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/alex1997222/article/details/86309616
今日推荐