活動安排問題 51nod

2021-08-14 01:24:54 字數 1378 閱讀 5742

原題鏈結

問題:

有若干個活動,第i個開始時間和結束時間是[si,fi),同乙個教室安排的活動之間不能交疊,求要安排所有活動,最少需要幾個教室? 

input第一行乙個正整數n (n <= 10000)代表活動的個數。

第二行到第(n + 1)行包含n個開始時間和結束時間。

開始時間嚴格小於結束時間,並且時間都是非負整數,小於1000000000

output一行包含乙個整數表示最少教室的個數。

sample input

3

1 23 4

2 9

sample output
2
找出同時進行活動的最大班級數,即為所求(sum)。

用兩個陣列來 記錄 開始的時間 和 結束的時間,

都從小到大排序。

設想:這兩組資料揉成一組,並且是按從小到大的順序排列的。

那麼 從頭開始遍歷。

如果 當前數字代表的是開始時間,那麼 sum++;

如多 當前數字代表的是結束時間,那麼 sum--;

過程中,sum的最大值即為所求。!

下面用橫線來模擬這個過程。(紅色的條數 便是 sum。)

每條線都有乙個 開始點 和 結束點。

____

______

________

_____

但是,我並不會把他們揉成一組,然後再判斷 的這個操作(

思考後發現(也參考了網上的思路)

並不需要真的揉成一組。

也不需要每個資料都遍歷。

只需要 把 排序後的開始時間 遍歷一遍。!!

先與第乙個 結束時間 比較,如果開始時間小(也就是揉成一組後的開始時間在前),sum++,

如果乙個開始時間大 ,就拿 下乙個開始時間 與 第二個 結束時間比較(否則一直與第乙個結束時間比較)(也就是香相當於揉成一組後,遍歷到了 結束時間。)

#include #include #include #define ll long long

using namespace std;

ll start[10010];

ll endt[10010];

int main()

sort(start,start+n);

sort(endt,endt+n);

int end_x = 0;

int sum = 0,t = 0;

for(int i = 0;i < n;i ++)

{if(start[i]

51nod 活動安排問題

有若干個活動,第i個開始時間和結束時間是 si,fi 只有乙個教室,活動之間不能交疊,求最多安排多少個活動?分析 我們就是想提高教室地利用率,盡可能多地安排活動。考慮容易想到的幾種貪心策略 1 開始最早的活動優先,目標是想盡早結束活動,讓出教室。然而,這個顯然不行,因為最早的活動可能很長,影響我們進...

51nod 活動安排問題

有若干個活動,第i個開始時間和結束時間是 si,fi 同乙個教室安排的活動之間不能交疊,求要安排所有活動,最少需要幾個教室?輸入 第一行乙個正整數n n 10000 代表活動的個數。第二行到第 n 1 行包含n個開始時間和結束時間。開始時間嚴格小於結束時間,並且時間都是非負整數,小於10000000...

51nod 活動安排問題 (貪心)

有若干個活動,第i個開始時間和結束時間是 si,fi 只有乙個教室,活動之間不能交疊,求最多安排多少個活動?分析 我們就是想提高教室地利用率,盡可能多地安排活動。考慮容易想到的幾種貪心策略 1 開始最早的活動優先,目標是想盡早結束活動,讓出教室。然而,這個顯然不行,因為最早的活動可能很長,影響我們進...