星期二下午,駕駛學科奧賽培訓。
沈笑夫才知道,江岸市第一職業中學一年級參加駕駛學科奧賽培訓的共有20人。
王老師親自上課。首先讓大家自我介紹,互相認識了一下。
20個同學,男生占了15個,女生僅僅5個,少得可憐!
沈笑夫翻閱《高中組駕駛學科奧賽基礎知識》,覺得比初中組難了不少。
王老師說,今天學習的是程序——《道路遊戲》。
【題目描述】
小新正在玩一個簡單的電腦道路遊戲。
遊戲中有一條環形馬路,馬路上有 n 個機器人工廠,兩個相鄰機器人工廠之間由一小段馬路連接。
小新以某個機器人工廠爲起點,按順時針順序依次将這 n 個機器人工廠編号爲1~n,因爲馬路是環形的,所以第 n 個機器人工廠和第 1 個機器人工廠是由一段馬路連接在一起的。
小新将連接機器人工廠的這 n 段馬路也編号爲 1~n,并規定第 i 段馬路連接第 i 個機器人工廠和第 i+1個機器人工廠(1≤i≤n-1),第 n 段馬路連接第n個機器人工廠和第 1個機器人工廠。
遊戲過程中,每個單位時間内,每段馬路上都會出現一些金币,金币的數量會随着時間發生變化,即不同單位時間内同一段馬路上出現的金币數量可能是不同的。
小新需要機器人的幫助才能收集到馬路上的金币。
所需的機器人必須在機器人工廠用一些金币來購買,機器人一旦被購買,便會沿着環形馬路按順時針方向一直行走,在每個單位時間内行走一次,即從當前所在的機器人工廠到達相鄰的下一個機器人工廠,并将經過的馬路上的所有金币收集給小新。
例如,小新在 i(1≤i≤n)号機器人工廠購買了一個機器人,這個機器人會從 i 号機器人工廠開始,順時針在馬路上行走,第一次行走會經過 i 号馬路,到達 i+1 号機器人工廠(如果 i=n,機器人會到達第 1 個機器人工廠),并将 i 号馬路上的所有金币收集給小新。
遊戲中,環形馬路上不能同時存在2個或者2個以上的機器人,并且每個機器人最多能夠在環形馬路上行走 p次。
小新購買機器人的同時,需要給這個機器人設定行走次數,行走次數可以爲 1~p 之間的任意整數。當馬路上的機器人行走完規定的次數之後會自動消失,小新必須立刻在任意一個機器人工廠中購買一個新的機器人,并給新的機器人設定新的行走次數。
以下是遊戲的一些補充說明
遊戲從小新第一次購買機器人開始計時。
購買機器人和設定機器人的行走次數是瞬間完成的,不需要花費時間。
購買機器人和機器人行走是兩個獨立的過程,機器人行走時不能購買機器人,購買完機器人并且設定機器人行走次數之後機器人才能行走。
在同一個機器人工廠購買機器人的花費是相同的,但是在不同機器人工廠購買機器人的花費不一定相同。
購買機器人花費的金币,在遊戲結束時再從小新收集的金币中扣除,所以在遊戲過程中小新不用擔心因金币不足,無法購買機器人而導緻遊戲無法進行。也因爲如此,遊戲結束後,收集的金币數量可能爲負。
現在已知每段馬路上每個單位時間内出現的金币數量和在每個機器人工廠購買機器人需要的花費,請你告訴小新,經過 個單位時間後,扣除購買機器人的花費,小新最多能收集到多少金币。
【輸入輸出格式】
【輸入格式】
第一行 3 個正整數,n,,p,意義如題目所述。
接下來的n 行,每行有個正整數,每兩個整數之間用一個空格隔開,其中第 i 行描
述了 i 号馬路上每個單位時間内出現的金币數量(1≤金币數量≤100),即第i行的第 j(1≤j≤)個數表示第 j 個單位時間内i号馬路上出現的金币數量。
最後一行,有 n 個整數,每兩個整數之間用一個空格隔開,其中第 i 個數表示在 i 号機器人工廠購買機器人需要花費的金币數量(1≤金币數量≤100)。
【輸出格式】
共一行,包含 1 個整數,表示在 個單位時間内,扣除購買機器人花費的金币之後,小新最多能收集到多少金币。
【思路】
用一維數組f儲存第i秒能獲得的最大錢數
因爲最多同時存在1個機器人
第i秒時第j個機器人走k次(1≈lt;=k≈lt;=p)
f[i]=ax(f[i],f[i-k]-pay[st]+su)
這裏是從當前點倒推
st是上一個點
當st=0,st=n
su要一遍遍加上錢k秒第st路上的金币數
每次減去第st條道路(即第st個工廠機器人)的價格
如果i-k≈lt;0
直接退出k循環,時間不爲負
【代碼】
cde≈lt;iostrea≈gt;
cde≈lt;cstdio≈gt;
cde≈lt;cstrg≈gt;
g naspace std;
t n,,p,b[1001],a[1001][1001],f[1001];
t a()
{
scanf(“ddd“,≈ap;n,≈ap;,≈ap;p);
set(f,-1000000,sizeof(f)); f[0]=0;
for(t i=1;i≈lt;=n;i++) for(t j=1;j≈lt;=;j++) scanf(“d“,≈ap;a[i][j]);
for(t i=1;i≈lt;=n;i++) scanf(“d“,≈ap;b[i]);
for(t i=1;i≈lt;=;i++)
for(t j=1;j≈lt;=n;j++)
{
t t=j-1;
if(!t) t=n;
t ss=a[t][i];
for(t k=1;k≈lt;=p;k++)
{
if(i-k≈lt;0) break;
f[i]=ax(f[i],f[i-k]+ss-b[t]);
t--;
if(!t) t=n;
ss+=a[t][i-k];
}
}
prtf(“d“,f[]);
return 0;
}
【數據範圍】
對于 40的數據,2≤n≤40,1≤≤40。
對于 90的數據,2≤n≤200,1≤≤200。
對于 100的數據,2≤n≤1000,1≤≤1000,1≤p≤。
【做法說明】
題目呢,比較長,信息比較多,注意不要看錯題。但是呢還是比較輕易可以看出這是dp題的類型。
dp[i][j]表示時間i在j點的最大收益,pre[j]表示j點的上一個,x[i]表示在時間i所有位置的最大收益(因爲買機器人是任意位置可買,轉移時直接用即可),g[i][j]表示狀态(i,j)取最優解時走的步數(這個明顯是越小越好啦),最後輸出ax(dp[][i])。
王老師說“高中駕駛學科奧賽,要更多地運用到數學與信息學的知識,請大家有機會課外都多補一補這方面的知識。”
沈笑夫心裏一陣咯噔,數學和信息學,要加油啊!
這時,坐在旁邊的一個男生對沈笑夫說“沈笑夫,我是汽車三班的劉李陽,請多關照!”
沈笑夫側目一看,這個男生臉色白淨,頭發新潮,一臉虔誠地看着自己。
沈笑夫點點頭說“互相關照!”
“有你這個大佬罩着,我心裏有譜了,呵呵!”劉李陽笑着說。
……
下課後,沈笑夫眼前出現了駕駛學科奧賽系統顯示屏
學科 l1,288/1000
體能 l1,97/100
情緒 l1,89/100
任務 0
獎勵獎勵記憶膠囊一粒。請點擊“兌獎”鍵領取獎勵。
學科、獎勵欄的背景亮着光,說明這兩項有了變化!其他欄目背景灰暗,說明沒有變化。
學科欄從284到288,增加了4個點,是這幾天學習駕駛學科知識的收獲。
獎勵欄再次出現久違的記憶膠囊!
沈笑夫有些雞凍,輕輕點擊“兌獎”鍵,屏幕裏立馬滾出一粒藍色的記憶膠囊!
好!
記憶膠囊在手,複雜的信息學,也就容易了!
麻煩的數學,也不會那麽麻煩了!
沈笑夫嘴角露出了開森的笑容!
。