智力大衝浪 解題報告

2021-08-28 07:25:42 字數 2035 閱讀 8133

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

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

輸入格式:

共4行。

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

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

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

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

輸出格式:

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

輸入輸出樣例

input

10000

74 2 4 3 1 4 6

70 60 50 40 30 20 10

output
思路:

這道題是經過一位學長的指♂點後想出來的(本人較菜)。

首先想到的是貪心:每次選能選的扣錢最多的任務。

但是!這樣做是有後效性的。

而且還可能會錯過最優解,試想一下,如果有乙個扣錢很多但是要求時間很晚的任務,且有乙個扣錢少的任務要求時間很早,那麼很可能就不選這個較早的任務了。但是事實上後面可能有大把時間去做那個大任務,所以可能就gg了。

所以換乙個思路,從最後的時間往前掃,把在這個時間點之後的任務加入大根堆中。每個時間點選在這個時間點後面的的任務中,扣錢最多的任務,再把這個任務從大根隊中刪除.

這樣既沒有後效性,也不會錯過最優解。

證明:略(其實不會)

其實也可以這樣想一下:

從前往後遍歷的話,會面臨很多選擇,很可能用較早的時間點完成了 完全可以用較晚的時間 完成的任務從而錯過最優解。

而從後往前,每次可以選擇的都是比這個點靠後的,想一下,用較晚的時間點完成較晚的任務,一定不會比用較早的時間點完成較晚的任務更差。所以,這個貪心是正確的 (強行證明)

code:

#include

using

namespace std;

#define maxn 505

#define inf 66666

int money,n,t;

struct game

}a[maxn]

;int head[maxn]

,cnt;

//大根堆

voidup(

int p)

else

break;}

}void

insert

(int val)

void

down

(int p)

else

break;}

}void

gettop()

intmain()

if(cnt>0)

gettop()

;}int temp=0;

for(

int i=

1;i<=cnt;i++

)//剩下的就是沒法選的

temp+

=head[i]

;printf

("%d\n"

,money-temp)

;return0;

}

由此得到啟發:正著遍歷有後效性的話可以倒著來試一下

智力大衝浪

時間限制 1 sec 記憶體限制 128 mb 提交 112 解決 71 提交 狀態 討論版 小偉報名參加 電視台的智力大衝浪節目。本次挑戰賽吸引了眾多參賽者,主持人為了表彰大家的勇氣,先獎勵每個參賽者m元。先不要太高興!因為這些錢還不一定都是你的?接下來主持人宣布了比賽規則 首先,比賽時間分為n個...

智力大衝浪

智力大衝浪 riddle 記憶體限制 128m 題目描述 例 1 智力大衝浪 riddle.pas 題目描述 小偉報名參加 電視台的智力大衝浪節目。本次挑戰賽吸引了眾多 參賽者,主持人為了表彰大家的勇氣,先獎勵每個參賽者 m 元。先 不要太高興!因為這些錢還不一定都是你的。接下來主持人宣布了比 賽規...

智力大衝浪

傳送門 同樣是一道貪心題。我們能想到,肯定是要做那些扣錢最多的,所以我們先把扣錢的多少拍一下序,之後,我們一定是要把這件事情盡量拖後做的,這樣才能保證盡量不影響其他的事件。而如果這個時間已經被占用,那就盡量向前排,實在排不了的丟棄即可。看一下 include include include incl...