1. 程式人生 > >貪心法的應用(2) 區間交集問題

貪心法的應用(2) 區間交集問題

問題描述:

給出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;
}