1. 程式人生 > >LOJ #10000 活動安排

LOJ #10000 活動安排

題目連結

題目描述

設有 n個活動的集合 E={1,2,..,n},其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內只有一個活動能使用這一資源。每個活動 i 都有一個要求使用該資源的起始時間 si和一個結束時間 fi,且 si<fi。如果選擇了活動 i ,則它在時間區間 [si,fi) 內佔用資源。若區間 [si,fi) 與區間 [sj,fj)不相交,則稱活動 i 與活動 j 是相容的。也就是說,當 fi≤sj 或 fj≤si  時,活動 i 與活動 j 相容。選擇出由互相相容的活動組成的最大集合。

輸入格式

第一行一個整數 n;

接下來的 n 行,每行兩個整數 si 和 fi。

輸出格式

輸出互相相容的最大活動個數。

樣例

樣例輸入

4
1 3
4 6
2 5
1 7

樣例輸出

2

資料範圍與提示

1≤n≤1000

區間排程問題。貪心演算法。在可選的活動中每次都選取結束時間最早的活動

AC程式碼:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
	int n;
	cin>>n;
	pair<int,int> acti[1001];
	for(int i=1;i<=n;i++)
	{
		//為了讓結束時間早的活動排在前面,把結束時間存入first,把開始時間存入second 
		int s,f;
		cin>>s>>f;
		acti[i].first=f;
		acti[i].second=s;
	}
	sort(acti+1,acti+n+1);//對pair進行的是字典序比較 
	//t是最後所選活動的結束時間,ans是互相相容的最大活動個數 
	int ans=0,t=0;
	for(int i=1;i<=n;i++)
	{
		if(t<=acti[i].second)
		{
			ans++;
			t=acti[i].first;
		}
	} 
	cout<<ans;
}