HDU 2037 今年暑假不AC 貪心

2022-07-16 05:30:12 字數 1451 閱讀 6567

題目鏈結 :

題意:

活動安排問題,要求活動之間不能有重疊,問最多能夠安排多少活動

分析:

這是經典的活動安排問題

首先可能想到是貪心問題或者動態規劃,直覺想到可能是貪心問題。可以想到的可能有三種安排策略:

① 先開始的活動先安排

② 時間短的活動先安排

③ 早結束的活動先安排

第一種策略不正確,舉例如下:

a1=<0, 20>, a2=<2, 5>, a3=<8, 15>,如果用這種策略則最多只能安排a1乙個活動,但事實上可以安排a2,a3兩個活動。

第二種策略也不正確,舉例如下:

a1=<0, 8>, a2=<7, 9>, a3=<8, 15>,如果用這種策略最多只能安排a2乙個活動,但事實上可以安排a1 ,a3 兩個活動。

第三種策略我覺得可以這麼思考,假設前k個活動的安排是最優的,那麼它一定是結束時間最早的一種安排方法(這樣在後面的安排中才會有更多的時間,安排更多的活動),將規模減小至只有乙個,即是早結束的活動先安排。下面給出策略正確性的證明:

證明:(對演算法步數進行歸納)

(1) 將活動集合按照截止時間遞增順序排列,得到序列s。

(2) 演算法第一步選擇s中的活動1,設演算法最終得到問題最優解為a=,則i1=1;(演算法第一步正確),若i1≠1,用1替換i1,可得到a』=(a-)∪,集合a』與a中活動個數相同,且1比i1結束的更早,因此與i2, i3, …, ij相容,於是a』也是問題的乙個最優解。

(3) 假設演算法前k步正確,令i1=1, i2, …, ik是前k步順序選擇的活動,則原為題最優解可表示為a=∪b,令s』是s中剩餘的與i1, i2, …, ik相容的活動,即s』=,則b是s』的乙個最優解。若不然,假設s』有最優解b』,且|b』| > |b|,那麼用b』替換b可以得到的解= ∪ b』將比a的活動更多,與a為最優解矛盾。

(4) 根據第(2)步,子問題s』存在最優解b*=,則a』= ∪b*= ∪(b*-)為原問題乙個最優解,且恰好包含了前k+1步選擇的活動。

策略確定之後,就是實現的方法,我的想法是通過自定義結構體並定義優先順序(結束時間早的優先順序高),再通過優先佇列儲存節目,最後pop一遍判斷可以**的節目數量。

**如下:

#include #include 

using

namespace

std;

struct

show

else

if(this->f ==s2.f)

else

return0;

}};int main(void

) //

while(!q.empty())

while(!q.empty())

}cout

<< ans <}

}

HDU 2037 今年暑假不AC

題目 hdu 2037 今年暑假不ac 解題思路 簡單貪心 對節目時間的結束時間由小到大進行排序,排序用sort或者qsort都可以,讓結束的早的時間排在前面,為後面的節目留出充足的時間,只要下乙個節目的的開始時間大於等於上乙個節目的結束時間就可以了。include includestruct ac...

HDU 2037 今年暑假不AC

problem description 今年暑假不ac?是的。那你幹什麼呢?看世界盃呀,笨蛋!確實如此,世界盃來了,球迷的節日也來了,估計很多acmer也會拋開電腦,奔向電視了。作為球迷,一定想看盡量多的完整的比賽,當然,作為新時代的好青年,你一定還會看一些其它的節目,比如新聞聯播 永遠不要忘記關心...

HDU 2037 今年暑假不AC

description 今年暑假不ac?是的。那你幹什麼呢?看世界盃呀,笨蛋!確實如此,世界盃來了,球迷的節日也來了,估計很多acmer也會拋開電腦,奔向電視了。作為球迷,一定想看盡量多的完整的比賽,當然,作為新時代的好青年,你一定還會看一些其它的節目,比如新聞聯播 永遠不要忘記關心國家大事 非常6...