NOJ 1205 活動安排

2021-10-10 08:46:41 字數 1498 閱讀 7674

描述

jack是一名nwpu的大一新生,對學校舉辦的各種活動都十分的好奇,想盡可能多的參加這些活動。npwu每天共有n項活動,其開始結束時間分別為b[i],e[i],(i = 1,2,……n)

請問jack一天最多能參加幾項活動。當然,jack在同一時間內只能參加一項活動,即jack參加的活動時間上不能重疊,但時間為[t1,t2],[t2,t3]的兩個活動是可以同時參加的。

輸入

第一行 乙個整數n(1<=n<=1000)表示活動總數。

接下來n行表示各活動的起始,結束時間0<=b[i]輸出

乙個整數表示jack最多能參加的活動數目。

輸入樣例4

10 11

2 38 10

0 2輸出樣例

提示

printf("%d\n,num");

方法一:

題意很明顯希望參加的活動數目盡量多。對於活動安排問題可以採取動態規劃的策略:

首先將活動的結束時間按照第一關鍵字排序(由小到大),再將活動的開始時間作為第二關鍵字排序(由小到大)

定義dp[i]表示在前i場比賽中最多可以參加幾場比賽,

由此得出方程:dp[i]=max(dp[i-1],dp[temp]+1);

temp指從dp[i-1]向前找到的第乙個允許參加第i場活動的活動編號,由它推導出dp[i]=dp[temp]+1;

由於每次迴圈時都向前找一次temp會浪費太多時間,又因為活動開始或結束時間是單調遞增的,

故可以令temp在迴圈時逐步遞增,這樣時間複雜度就降到了o(n).

這裡只是講解一下動態規劃的想法。就不寫**了,動態規劃的**和下面的貪心方法相似。只是這種動態規劃的思路是基於貪心的思想來實現的。

方法二:

這個問題可以抽象為在乙個數軸上有n條線段,現要選取其中k條線段使得這k條線段兩兩沒有重合部分,問最大的k為多少。

最左邊的線段放什麼最好?

顯然放右端點最靠左的線段最好,從左向右放,右端點越小妨礙越少。

其他線段放置按右端點排序,貪心放置線段,即能放就放。

以上兩種方法的時間複雜度都是o(nlogn),快速排序的時間複雜度是o(nlogn),而動態規劃或者貪心執行更新策略的時間複雜度是o(n).

#include

#include

#include

#include

using

namespace std;

const

int maxn=

2e3+50;

int n;

struct nodea[maxn]

;bool

cmp(node x,node y)

intmain()

opt++;}

cout

}

活動安排問題

作為新一代的好青年肯定會喜歡許多的電視節目,比如說新聞聯播,焦點訪談,又如招聘類的節目有非你莫屬,職來職往,娛樂節目如快樂大本營。現在給你每個節目的開始時間和結束時間,要求你求出看盡可能多的完整節目。每個電視節目i都有乙個起始時間si和乙個結束時間fi,且si 對於活動安排問題可以用貪心演算法解決,...

活動安排問題

活動安排 描述 設有n個活動的集合e 其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內只有乙個活動能使用這一資源。每個活動i都有乙個要求使用該資源的起始時間si和乙個結束時間fi,且si 輸入 輸入只有乙個用例,第一行為一正整數n,表示活動個數,接下來n行,每行兩個整數,分別表示第i號活...

活動安排問題

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