小偉報名參加**電視台的智力大衝浪節目。本次挑戰賽吸引了眾多參賽者,主持人為了表彰大家的勇氣,先獎勵每個參賽者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)
#includeusingnamespace
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 如...