P1230 智力大衝浪

2022-04-29 03:15:11 字數 1241 閱讀 9848

小偉報名參加**電視台的智力大衝浪節目。本次挑戰賽吸引了眾多參賽者,主持人為了表彰大家的勇氣,先獎勵每個參賽者m元。先不要太高興!因為這些錢還不一定都是你的?!接下來主持人宣布了比賽規則:

首先,比賽時間分為n個時段(n≤500),它又給出了很多小遊戲,每個小遊戲都必須在規定期限ti前完成(1≤ti≤n)。如果乙個遊戲沒能在規定期限前完成,則要從獎勵費m元中扣去一部分錢wi,wi為自然數,不同的遊戲扣去的錢是不一樣的。當然,每個遊戲本身都很簡單,保證每個參賽者都能在乙個時段內完成,而且都必須從整時段開始。主持人只是想考考每個參賽者如何安排組織自己做遊戲的順序。作為參賽者,小偉很想贏得冠軍,當然更想贏取最多的錢!注意:比賽絕對不會讓參賽者賠錢!

輸入格式:

輸入檔案riddle.in,共4行。

第1行為m,表示一開始獎勵給每位參賽者的錢;

第2行為n,表示有n個小遊戲;

第3行有n個數,分別表示遊戲1到n的規定完成期限;

第4行有n個數,分別表示遊戲1到n不能在規定期限前完成的扣款數。

輸出格式:

僅1行。表示小偉能贏取最多的錢。

輸入樣例:

4 2 4 3 1 4 6

70 60 50 40 30 20 10

輸出樣例:

9950

因為不同的小遊戲不能準時完成時具有不同的扣款權數,而且是求問題的最優解,所以很容易想到用貪心演算法求解。

貪心策略是讓扣款數額大的盡量在規定的期限內完成,這樣我們就先把這些任務按照扣款的數額進行排序,把大的排在前面,進行放置。

假如罰款最多的乙個任務的完成期限是k,我們應該放在小於等於k的最靠後的時間段。

一旦出現乙個不可能在規定期限內完成的任務,則把其扔到最大的乙個空時間段,因為不能完成的任務在任意乙個時間段中罰款數額都是一樣的,這樣得到的結果必然是最優的。

時間複雜度:o(n^2)

#includeusing

namespace

std;

struct

hht[

501];

int bj,hash[501]=,n,m,i,j,k,s;

bool cmp(const hh&d,const hh&e)

intmain()

}if(bj==1)//

要罰款

}s+=t[i].y;//

累加罰款

} }

cout

輸出return0;

}

P1230 智力大衝浪

這題應該是貪心吧,對於每乙個遊戲,當然是扣錢扣得多的先玩,按照價值從大到小排序,對於當前的價值,從當前的t時段開始遍歷,如果說t時段已經被占用了,看看前面的t 1是否被占用,一直到1 如果都被占用了,說明這個遊戲不能進行 include include using namespace std str...

P1230 智力大衝浪

智力大衝浪 翻了翻題解發現沒有並查集解法 眼瞎勿怪 於是水一發題解。貌似跑得比某些題解快 首先肯定是盡量做減少 大的任務,所以就按照價值從大到小排個序。然後就有並查集的玄學操作了 找到商品 i 的祖先 find i 倘若 find i 0 加上 i 的價值,合併 find i 與 find find...

洛谷P1230智力大衝浪

小偉報名參加 電視台的智力大衝浪節目。本次挑戰賽吸引了眾多參賽者,主持人為了表彰大家的勇氣,先獎勵每個參賽者m元。先不要太高興!因為這些錢還不一定都是你的?接下來主持人宣布了比賽規則 首先,比賽時間分為n個時段 n 500 它又給出了很多小遊戲,每個小遊戲都必須在規定期限ti前完成 1 ti n 如...