1. 程式人生 > >選擇不相交區間(貪心)

選擇不相交區間(貪心)

  • 記憶體限制:64MB 時間限制:1000ms
  • 題目描述:  

好吧。這道題的目的在於讓大家認識貪心問題的三個區間經典問題:區間選點問題,區間覆蓋問題,以及該題的選擇不相交區間問題。有許多的貪心問題可以轉化為這三類的問題。

那麼,對於該問題。就是給一系列的區間,求最多的區間,要求區間個數最多,這些區間不相交,需要注意的是這些區間都是閉區間。

輸入描述:

第一行一個數n為區間個數(n<=1000)
接下來有n行,每行有兩個數a,b分別為區間的兩個端點,a,b在int範圍。
EOF結尾。

輸出描述:

輸出如樣例所示

樣例輸入:

2 1 10 10 11 3 1 10 10 11 11 20

樣例輸出:

Case 1: 1. Case 2: 2.

解題思路:

選擇不相交區間問題:貪心思想,先按b從小到大進行排序,再選擇b0作為選點temp,如果出現ai>temp,則以bi作為temp,再按照這樣的方式迭代,直至所有區間遍歷完。這道題有點坑,輸入的時候要判斷兩個端點的大小。

#include <iostream>
#include <algorithm>
using namespace std;
struct edge {
	int l, r;
}e[1010];
int cmp(edge a, edge b)
{
	return a.r < b.r;
}
int main()
{
	int t = 1, n, ans, temp;
	while (cin >> n)
	{
		ans = 1;
		for (int i = 0; i < n; i++)
		{
			cin >> e[i].l >> e[i].r;
			if (e[i].l > e[i].r)
				swap(e[i].l, e[i].r);
		}
		sort(e, e + n, cmp);
		temp = e[0].r;
		for (int i = 1; i < n; i++)
		{
			if (e[i].l > temp)
			{
				ans++;
				temp = e[i].r;
			}
		}
		cout << "Case " << t++ << ":\n" << ans << ".\n";
	}
	return 0;
}