51 Nod1428活動安排

2021-08-01 03:49:02 字數 1340 閱讀 7986

1428 活動安排問題

基準時間限制:1 秒 空間限制:131072 kb 分值: 10 

難度:2級演算法題

input

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

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

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

output

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

3

1 23 4

2 9

output示例

2

曹鵬(題目提供者)

題意:給你n個活動時間段,求至少需要多少教室進行活動。

拿到這個題目,我最開始想到了以前在杭電上寫的乙個題目,也是道貪心,比這個簡單。那個題目是n個活動區間,問一天做多進行多少個活動,那個題目的思路是把區間按照結束時間進行排序,然後開迴圈依次查詢,保證每次活動一都最省時。這個題目跟那個題目或多或少有一定的聯絡。

我最開始的想法是按照結束時間排序,然後開迴圈掃瞄,每次一整體迴圈代表的是一間房間,使盡可能多的活動在一間房進行(因為以前的經驗,下意識的以為這樣的活動最多,也不能說是最多,時間利用率最大)。我在這個迴圈的外圍寫了個死迴圈,旨在判斷所有元素是否全部掃瞄到,若全部掃瞄到,則跳出。**寫好了拿去提交,結果是wa,我就去找反例。最後找到這麼一組資料【1,2】,【1,4】,【3,7】,【5,6】。乍一看沒什麼問題,debug除錯了一次後才明白是怎麼回事,原來這麼寫第一組迴圈找到的是【1,2】和【5,6】,第二組則是【1,4】,第三組是【3,7】,結果輸出3,本應該是第一組【1,2】和【3,7】,第二組【1,4】和【5,6】,輸出2。

我要做的就是在找到【1,2】後,下乙個找到的是【3,7】,這樣一來就就直觀多了,我把排序換成了按照開始時間排序,這樣就能解決這個問題。果然不出所料,ac。附上**

#include #include typedef struct time

t;t arr[10005];

int cmp(const void*a,const void*b)

int main()}}

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

return 0;

}

ac之後跟隊友交流了一下,發現還有另外一種思路也可以解這個題。即找到區間重疊次數多大的數量,那個就是最少房間數。這個方法真心簡單。思路附上:把所有的開始時間結束時間存到乙個陣列裡面,做好標記(開始和結束),排序,從小到大。開迴圈掃瞄,遇到開始時間就讓房間數自加,遇到結束時間就讓房間數自減,輸出這個過程中最大的房間數即為解。

51nod 1428 活動安排問題

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

51Nod 1428 活動安排問題

acm模版 將所有開始時間和結束時間存入乙個陣列內,然後排序,最後從頭至尾遍歷,初始化flag 0,遇見開始時間則flag 反之則更新res並flag include include include using namespace std const int maxn 1e4 10 struct p...

51nod 1428 活動安排問題

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