1426 例題5 智力大衝浪

2021-10-21 12:01:26 字數 1341 閱讀 5229

小偉報名參加**電視台的智力大衝浪節目。本次挑戰賽吸引了眾多參賽者,主持人為了表彰大家的勇氣,先獎勵每個參賽者m元。先不要太高興!因為這些錢還不一定都是你的。接下來主持人宣布了比賽規則: 首先,比賽時間分為n個時段(n≤500),它又給出了很多小遊戲,每個小遊戲都必須在規定期限ti前完成(1≤ti≤n)。如果乙個遊戲沒能在規定期限前完成,則要從獎勵費m元中扣去一部分錢wi,wi為自然數,不同的遊戲扣去的錢是不一樣的。當然,每個遊戲本身都很簡單,保證每個參賽者都能在乙個時段內完成,而且都必須從整時段開始。主持人只是想考考每個參賽者如何安排組織自己做遊戲的順序。作為參賽者,小偉很想贏得冠軍,當然更想贏取最多的錢! 注意:比賽絕對不會讓參賽者賠錢!

輸入共4行。

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

第二行為n,表示有n個小遊戲; 第三行有n個數,分別表示遊戲1~n的規定完成期限;

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

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

10000

74 2 4 3 1 4 6

70 60 50 40 30 20 10

9950
n≤500,1≤ti≤n

關鍵是題目的理解,特別是時段這一塊。

m元錢做n個任務,每乙個任務要花一整個時段來做,而且每個任務都有自己的截止時間(開始到第ti個時間),若是在截止前沒完成則在m元中扣掉相應的wi元。為了得到更多錢,意味著需扣最少的錢。所以逆向思考將扣錢當作首要考慮的問題,再來考慮截止時間。

考慮用貪心,錢數越大越重要,截止時間越大,完成它的時間就越長。定義乙個v陣列標記是否對應時段i被占用,每乙個物品都從截止時間往前搜尋直到有一天沒有用過。越靠後的時間越好,盡量不占用前面的時間。若是最終沒有符合條件的時間i,則需扣對應的wi。

將w從大到小排序,優先處理罰款多的,將任務盡量安排在期限之前,並且靠後,如果找不到,則扣錢。

**如下:

#includeusing namespace std;

struct stua[501];

bool cmp(stu x,stu y)

bool v[501];//用來標記對應時段被使用。

int main()

for(int i=1;i<=n;++i)

sort(a+1,a+n+1,cmp);

for(int i=1;i<=n;++i)

if(curt>0) v[curt]=true;//當前時段被占用完成任務i

else m -= a[i].w;//當前任務i沒有合適時段可以用來完成,扣除對應款項

} cout

}

算典04 例題 03

n n 20 個人站成一圈,逆時針編號為1 n。有兩個 a從1開始逆時針數,b從n開始順時針數。在每一輪中,a數k個就停下來,b數m個就停下來 注意有可能兩個 停在同乙個人上 接下來被 選中的人 1個或者2個 離開隊伍。輸入n,k,m輸出每輪裡被選中的人的編號 如果有兩個人,先輸出被a選中的 例如,...

算典05 例題 04

輸入一些單詞區 分大小寫 如果某個單詞與其他任何單詞沒有聯絡,則輸入這個單詞。兩個單詞有聯絡的意思是忽略他們的大小寫之後和字母的順序,所有的字母出現的次數都相等,如dog 和god 要求結果按字典序輸出 stl入門水題。使用兩個string陣列記錄輸入的單詞和處理後的單詞,處理後的意思即為都轉為小寫...

算典05 例題 06

有t個團隊正在排乙個長隊,每次新來乙個人,如果他有隊友在排隊,他就會插到最後乙個隊友的後面,否則他就會排到隊尾 對於每個出隊操作,輸出出隊的隊員編號 stl水題。練習使用佇列queue 這裡用兩個佇列,乙個記錄每個隊的排隊情況,乙個記錄長隊中排隊的團隊編號 include include inclu...