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) 提交結果