貪心算法——NY 14 會場安排問題

1)   題目

會場安排問題

時間限制:3000 ms  |  內存限制:65535 KB

難度:4

描述

學校的小禮堂每天都會有許多活動,有時間這些活動的計劃時間會發生衝突,需要選擇出一些活動進行舉辦。小劉的工作就是安排學校小禮堂的活動,每個時間最多安排一個活動。現在小劉有一些活動計劃的時間表,他想儘可能的安排更多的活動,請問他該如何安排。

輸入

第一行是一個整型數m(m<100)表示共有m組測試數據。
每組測試數據的第一行是一個整數n(1<n<10000)表示該測試數據共有n個活動。
隨後的n行,每行有兩個正整數Bi,Ei(0<=Bi,Ei<10000),分別表示第i個活動的起始與結束時間(Bi<=Ei)

輸出

對於每一組輸入,輸出最多能夠安排的活動數量。
每組的輸出佔一行

樣例輸入

2

2

1 10

10 11

3

1 10

10 11

11 20

樣例輸出

1

2

提示

注意:如果上一個活動在t時間結束,下一個活動最早應該在t+1時間開始

 

2)    題意

兩活動如果時間上有重疊,就會產生衝突,不能同時進行。給出一組活動時間表,求出最多可以安排多少活動。


3)    數據範圍

測試數據組數小於100;

一組數據的活動數爲n,1<n<10000,枚舉不可行;

活動的開始時間爲b和結束時間爲e,0<=b<=e<=10000。


4)    算法

一個活動的信息有開始時間,持續時間,結束時間。

若優先選擇開始時間早的,比如一個活動在0時開始,10000時結束,那麼只能進行一個活動,顯然不可行。

若優先選擇持續時間短的,例如一組數據:

3

1 5

5 6

6 10

先選擇的就是第二個活動,第一個和第三個就沒法進行,所以也不可行。

若優先選擇結束時間早的,這樣就可以騰出儘可能多的時間供接下來的活動使用,可行。

所以使用貪心算法,優先選擇結束時間早的活動。


5)    代碼

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

#define SIZE 10005

struct Activity_Info
{
	int s;	//開始時間
	int e;	//結束時間
}acts[SIZE];

bool Cmp(const Activity_Info a, const Activity_Info b)
{
	return a.e < b.e;
}

int ArrangingActivities(int n)
{
	//按結束時間從小到大排序
	sort(acts, acts+n, Cmp);

	int count = 0;
	int currTime = -1;	//當前時間
	int i;
	for (i = 0; i < n; i++)
	{
		if (acts[i].s > currTime)
		{
			count++;
			currTime = acts[i].e;
		}
	}
	return count;
}

int main(void)
{
	int ncases;
	scanf("%d", &ncases);
	while (ncases-- != 0)
	{
		int n;
		scanf("%d", &n);

		int i;
		for (i = 0; i < n; i++)
		{
			scanf("%d%d", &acts[i].s, &acts[i].e);
		}

		printf("%d\n", ArrangingActivities(n));
	}
	return 0;
}

6)    測試數據

4

2

1 10

10 11

3

1 10

10 11

11 20

6

1 10

12 16

11 17

10 11

2 3

4 8

3

1 5

5 6

6 10


7)    提交結果


發佈了66 篇原創文章 · 獲贊 31 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章