星期二下午,駕駛學科奧賽培訓。
沈笑夫才知道,江岸市第一職業中學一年級參加駕駛學科奧賽培訓的共有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之間的任意整數。當馬路上的機器人行走完規定的次數之後會自動消失,小新必須立刻在任意一個機器人工廠中購買一個新的機器人,並給新的機器人設定新的行走次數。
以下是遊戲的一些補充說明:
遊戲從小新第一次購買機器人開始計時。
購買機器人和設定機器人的行走次數是瞬間完成的,不需要花費時間。
購買機器人和機器人行走是兩個獨立的過程,機器人行走時不能購買機器人,購買完機器人並且設定機器人行走次數之後機器人才能行走。
在同一個機器人工廠購買機器人的花費是相同的,但是在不同機器人工廠購買機器人的花費不一定相同。
購買機器人花費的金幣,在遊戲結束時再從小新收集的金幣中扣除,所以在遊戲過程中小新不用擔心因金幣不足,無法購買機器人而導致遊戲無法進行。也因為如此,遊戲結束後,收集的金幣數量可能為負。
現在已知每段馬路上每個單位時間內出現的金幣數量和在每個機器人工廠購買機器人需要的花費,請你告訴小新,經過m個單位時間後,扣除購買機器人的花費,小新最多能收集到多少金幣。
【輸入輸出格式】
【輸入格式】
第一行3個正整數,n,m,p,意義如題目所述。
接下來的n行,每行有m個正整數,每兩個整數之間用一個空格隔開,其中第i行描
述了i號馬路上每個單位時間內出現的金幣數量(1≤金幣數量≤100),即第i行的第j(1≤j≤m)個數表示第j個單位時間內i號馬路上出現的金幣數量。
最後一行,有n個整數,每兩個整數之間用一個空格隔開,其中第i個數表示在i號機器人工廠購買機器人需要花費的金幣數量(1≤金幣數量≤100)。
【輸出格式】
共一行,包含1個整數,表示在m個單位時間內,扣除購買機器人花費的金幣之後,小新最多能收集到多少金幣。
【思路】
用一維數組f儲存第i秒能獲得的最大錢數
因為最多同時存在1個機器人
第i秒時第j個機器人走k次(1=k=p)
f[i]=max(f[i],f[i-k]-payst]+sum)
這裏是從當前點倒推
st是上一個點
st=0st=n
sum要一遍遍加上錢k秒st路上的金幣數
每次減去st條道路(即st個工廠機器人)的價格
如果i-k0
直接退出k循環,時間不為負
【代碼】
#includeiostream
#includecstdio
#includecstring
usingnamespacestd;
intn,m,p,b[1001],a[1001][1001],f[1001];
intmain{
scanf(“%d%d%d“,n,m,p);
memset(f,-,sizeof(f));f[0]=0;
for(inti=1;i=n;i++)for(intj=1;j=m;j++)scanf(“%d“,a[i][j]);
for(inti=1;i=n;i++)scanf(“%d“,b[i]);
for(inti=1;i=m;i++)
for(intj=1;j=n;j++)
{
intt=j-1;
if(!t)t=n;
intss=a[t][i];
for(intk=1;k=p;k++)
{
if(i-k0)break;
f[i]=max(f[i],f[i-k]+ss-b[t]);
t--;
if(!t)t=n;
ss+=a[t][i-k];
}
}
printf(“%d“,f[m]);
return0;
}
【數據範圍】
對於40%的數據,2≤n≤40,1≤m≤40。
對於90%的數據,2≤n≤200,1≤m≤200。
對於100%的數據,2≤n≤1000,1≤m≤1000,1≤p≤m。
【做法說明】
題目呢,比較長,信息比較多,注意不要看錯題。但是呢還是比較輕易可以看出這是dp題的類型。
dp[i][j]表示時間i在j點的最大收益,pre[j]表示j點的上一個,mx[i]表示在時間i所有位置的最大收益(因為買機器人是任意位置可買,轉移時直接用即可),g[i][j]表示狀態(i,j)取最優解時走的步數(這個明顯是越小越好啦),最後輸出max(dp[m][i])。
王老師說:“高中駕駛學科奧賽,要更多地運用到數學與信息學的知識,請大家有機會課外都多補一補這方麵的知識。”
沈笑夫心裏一陣咯噔,數學和信息學,要加油啊!
這時,坐在旁邊的一個男生對沈笑夫說:“沈笑夫,我是汽車三班的劉李陽,請多關照!”
沈笑夫側目一看,這個男生臉色白淨,頭發新潮,一臉虔誠地看著自己。
沈笑夫點點頭說:“互相關照!”
“有你這個大佬罩著,我心裏有譜了,嗬嗬!”劉李陽笑著說。
……
下課後,沈笑夫眼前出現了駕駛學科奧賽係統顯示屏:
學科:l1,
體能:l1,
情緒:l1,
任務:0
獎勵:獎勵記憶膠囊一粒。請點擊“兌獎”鍵領取獎勵。
學科、獎勵欄的背景亮著光,說明這兩項有了變化!其他欄目背景灰暗,說明沒有變化。
學科欄從284到288,增加了4個點,是這幾天學習駕駛學科知識的收獲。
獎勵欄再次出現久違的記憶膠囊!
沈笑夫有些雞凍,輕輕點擊“兌獎”鍵,屏幕裏立馬滾出一粒藍色的記憶膠囊!
好!
記憶膠囊在手,複雜的信息學,也就容易了!
麻煩的數學,也不會那麽麻煩了!
沈笑夫嘴角露出了開森的笑容!
沈笑夫才知道,江岸市第一職業中學一年級參加駕駛學科奧賽培訓的共有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之間的任意整數。當馬路上的機器人行走完規定的次數之後會自動消失,小新必須立刻在任意一個機器人工廠中購買一個新的機器人,並給新的機器人設定新的行走次數。
以下是遊戲的一些補充說明:
遊戲從小新第一次購買機器人開始計時。
購買機器人和設定機器人的行走次數是瞬間完成的,不需要花費時間。
購買機器人和機器人行走是兩個獨立的過程,機器人行走時不能購買機器人,購買完機器人並且設定機器人行走次數之後機器人才能行走。
在同一個機器人工廠購買機器人的花費是相同的,但是在不同機器人工廠購買機器人的花費不一定相同。
購買機器人花費的金幣,在遊戲結束時再從小新收集的金幣中扣除,所以在遊戲過程中小新不用擔心因金幣不足,無法購買機器人而導致遊戲無法進行。也因為如此,遊戲結束後,收集的金幣數量可能為負。
現在已知每段馬路上每個單位時間內出現的金幣數量和在每個機器人工廠購買機器人需要的花費,請你告訴小新,經過m個單位時間後,扣除購買機器人的花費,小新最多能收集到多少金幣。
【輸入輸出格式】
【輸入格式】
第一行3個正整數,n,m,p,意義如題目所述。
接下來的n行,每行有m個正整數,每兩個整數之間用一個空格隔開,其中第i行描
述了i號馬路上每個單位時間內出現的金幣數量(1≤金幣數量≤100),即第i行的第j(1≤j≤m)個數表示第j個單位時間內i號馬路上出現的金幣數量。
最後一行,有n個整數,每兩個整數之間用一個空格隔開,其中第i個數表示在i號機器人工廠購買機器人需要花費的金幣數量(1≤金幣數量≤100)。
【輸出格式】
共一行,包含1個整數,表示在m個單位時間內,扣除購買機器人花費的金幣之後,小新最多能收集到多少金幣。
【思路】
用一維數組f儲存第i秒能獲得的最大錢數
因為最多同時存在1個機器人
第i秒時第j個機器人走k次(1=k=p)
f[i]=max(f[i],f[i-k]-payst]+sum)
這裏是從當前點倒推
st是上一個點
st=0st=n
sum要一遍遍加上錢k秒st路上的金幣數
每次減去st條道路(即st個工廠機器人)的價格
如果i-k0
直接退出k循環,時間不為負
【代碼】
#includeiostream
#includecstdio
#includecstring
usingnamespacestd;
intn,m,p,b[1001],a[1001][1001],f[1001];
intmain{
scanf(“%d%d%d“,n,m,p);
memset(f,-,sizeof(f));f[0]=0;
for(inti=1;i=n;i++)for(intj=1;j=m;j++)scanf(“%d“,a[i][j]);
for(inti=1;i=n;i++)scanf(“%d“,b[i]);
for(inti=1;i=m;i++)
for(intj=1;j=n;j++)
{
intt=j-1;
if(!t)t=n;
intss=a[t][i];
for(intk=1;k=p;k++)
{
if(i-k0)break;
f[i]=max(f[i],f[i-k]+ss-b[t]);
t--;
if(!t)t=n;
ss+=a[t][i-k];
}
}
printf(“%d“,f[m]);
return0;
}
【數據範圍】
對於40%的數據,2≤n≤40,1≤m≤40。
對於90%的數據,2≤n≤200,1≤m≤200。
對於100%的數據,2≤n≤1000,1≤m≤1000,1≤p≤m。
【做法說明】
題目呢,比較長,信息比較多,注意不要看錯題。但是呢還是比較輕易可以看出這是dp題的類型。
dp[i][j]表示時間i在j點的最大收益,pre[j]表示j點的上一個,mx[i]表示在時間i所有位置的最大收益(因為買機器人是任意位置可買,轉移時直接用即可),g[i][j]表示狀態(i,j)取最優解時走的步數(這個明顯是越小越好啦),最後輸出max(dp[m][i])。
王老師說:“高中駕駛學科奧賽,要更多地運用到數學與信息學的知識,請大家有機會課外都多補一補這方麵的知識。”
沈笑夫心裏一陣咯噔,數學和信息學,要加油啊!
這時,坐在旁邊的一個男生對沈笑夫說:“沈笑夫,我是汽車三班的劉李陽,請多關照!”
沈笑夫側目一看,這個男生臉色白淨,頭發新潮,一臉虔誠地看著自己。
沈笑夫點點頭說:“互相關照!”
“有你這個大佬罩著,我心裏有譜了,嗬嗬!”劉李陽笑著說。
……
下課後,沈笑夫眼前出現了駕駛學科奧賽係統顯示屏:
學科:l1,
體能:l1,
情緒:l1,
任務:0
獎勵:獎勵記憶膠囊一粒。請點擊“兌獎”鍵領取獎勵。
學科、獎勵欄的背景亮著光,說明這兩項有了變化!其他欄目背景灰暗,說明沒有變化。
學科欄從284到288,增加了4個點,是這幾天學習駕駛學科知識的收獲。
獎勵欄再次出現久違的記憶膠囊!
沈笑夫有些雞凍,輕輕點擊“兌獎”鍵,屏幕裏立馬滾出一粒藍色的記憶膠囊!
好!
記憶膠囊在手,複雜的信息學,也就容易了!
麻煩的數學,也不會那麽麻煩了!
沈笑夫嘴角露出了開森的笑容!