NOIP2009 道路遊戲

2022-05-21 06:43:47 字數 2924 閱讀 2779

小新正在玩乙個簡單的電腦遊戲。 遊戲中有一條環形馬路,馬路上有 n

'>n

n 個機械人工廠,兩個相鄰機械人工廠之間由一小段馬路連線。小新以某個機械人工廠為起點,按順時針順序依次將這 n

'>n

n 個機械人工廠編號為 1~n

'>1~n

1~n,因為馬路是環形的,所以第 n

'>n

n 個機械人工廠和第 1

'>1

1 個機械人工廠是由一段馬路連線在一起的。小新將連線機械人工廠的這 n

'>n

n 段馬路也編號為 1~n

'>1~n

1~n,並規定第 i

'>i

i 段馬路連線第 i

'>i

i 個機械人工廠和第 i+1

'>i+1

i+1 個機械人工廠(1≤i

≤n−1

'>1≤i≤n−1

1≤i≤n−1),第 n

'>n

n 段馬路連線第 n

'>n

n 個機械人工廠和第 1

'>1

1 個機械人工廠。

遊戲過程中,每個單位時間內,每段馬路上都會出現一些金幣,金幣的數量會隨著時間發生變化,即不同單位時間內同一段馬路上出現的金幣數量可能是不同的。小新需要機械人的幫助才能收集到馬路上的金幣。所需的機械人必須在機械人工廠用一些金幣來購買,機械人一旦被購買,便會沿著環形馬路按順時針方向一直行走,在每個單位時間內行走一次,即從當前所在的機械人工廠到達相鄰的下乙個機械人工廠,並將經過的馬路上的所有金幣收集給小新,例如,小新在 i

'>i

i(1≤i≤

n'>1≤i≤n

1≤i≤n)號機械人工廠購買了乙個機械人,這個機械人會從 i

'>i

i 號機械人工廠開始,順時針在馬路上行走,第一次行走會經過 i

'>i

i 號馬路,到達 i+1

'>i+1

i+1 號機械人工廠(如果 i=n

'>i=n

i=n,機械人會到達第 1

'>1

1 個機械人工廠),並將 i

'>i

i 號馬路上的所有金幣收集給小新。 

遊戲中,環形馬路上不能同時存在 2

'>2

2 個或者 2

'>2

2 個以上的機械人,並且每個機械人最多能夠在環形馬路上行走 p

'>p

p次。小新購買機械人的同時,需要給這個機械人設定行走次數,行走次數可以為 1~p

'>1~p

1~p 之間的任意整數。當馬路上的機械人行走完規定的次數之後會自動消失,小新必須立刻在任意乙個機械人工廠中購買乙個新的機械人,並給新的機械人設定新的行走次數。

以下是遊戲的一些補充說明: 

遊戲從小新第一次購買機械人開始計時。 

購買機械人和設定機械人的行走次數是瞬間完成的,不需要花費時間。 

購買機械人和機械人行走是兩個獨立的過程,機械人行走時不能購買機械人,購買完機械人並且設定機械人行走次數之後機械人才能行走。 

在同乙個機械人工廠購買機械人的花費是相同的,但是在不同機械人工廠購買機械人的花費不一定相同。 

購買機械人花費的金幣,在遊戲結束時再從小新收集的金幣中扣除,所以在遊戲過程中小新不用擔心因金幣不足,無法購買機械人而導致遊戲無法進行。也因為如此,遊戲結束後,收集的金幣數量可能為負。 

現在已知每段馬路上每個單位時間內出現的金幣數量和在每個機械人工廠購買機械人需要的花費,請你告訴小新,經過m 個單位時間後,扣除購買機械人的花費,小新最多能收集到多少金幣。

第一行 3 個正整數,n,m,p,意義如題目所述。 

接下來的 n 行,每行有m 個正整數,每兩個整數之間用乙個空格隔開,其中第i 行描述了i 號馬路上每個單位時間內出現的金幣數量(1≤金

幣數量≤

100'>1≤金幣數量≤100

1≤金幣數量≤100),即第i 行的第j(1 ≤ j ≤m)個數表示第j 個單位時間內i 號馬路上出現的金幣數量。 

最後一行,有 n 個整數,每兩個整數之間用乙個空格隔開,其中第i 個數表示在i 號機械人工廠購買機械人需要花費的金幣數量(1 ≤ 金幣數量≤ 100)。

共一行,包含1 個整數,表示在m 個單位時間內,扣除購買機械人花費的金幣之後,小新最多能收集到多少金幣。

2 3 2 

1 2 3 

2 3 4 

1 2資料範圍 

對於 40%的資料,2 ≤ n ≤ 40,1 ≤m≤ 40。 

對於 90%的資料,2 ≤ n ≤ 200,1 ≤m≤ 200。 

對於 100%的資料,2 ≤ n ≤ 1000,1 ≤m≤ 1000,1 ≤ p ≤m。

noip2009普及組 

動態規劃, 單調佇列

題解:首先這個題目一開始就想到dp了吧。

dp[i]表示前i天的最大收貨,那麼dp[i]=max(dp[j]+maxx(從j跑到i的最大值),那麼這是乙個很神奇的dp,寫的好就是n^3,寫不好就是n^4,n^4就是上述方程,暴力算maxx,n^3就是列舉從那裡轉移,然後先列舉從那出發,一次一次累加maxx,這樣就是n^3了。

**:

#include #include 

#include

#include

#include

#include

#define maxn 1010

using

namespace

std;

intf[maxn],gett[maxn][maxn],cost[maxn];

intn,m,p;

int getzhi(int now,int shi,int

ti)

return ans-cost[noww];

}int

main()

}printf("%d

",f[m]);

return0;

}

NOIP2009PJ 道路遊戲

啊哈,現在有重溫了一遍o o 從以前的o n2 現在的o n3 感覺自己廢了 儘管 大幅度減少 我們可以發現p其實只是乙個限制的作用,不需要列舉啊,它是乙個個走的,所以只需要記錄一下就行了 uses math var f,g array 0.1001,0.1001,0.1 of longint a ...

NOIP2009PJ 道路遊戲

啊哈,現在有重溫了一遍o o 從以前的o n2 現在的o n3 感覺自己廢了 儘管 大幅度減少 我們可以發現p其實只是乙個限制的作用,不需要列舉啊,它是乙個個走的,所以只需要記錄一下就行了 uses math var f,g array 0.1001,0.1001,0.1 of longint a ...

1131 NOIP2009PJ 道路遊戲

1131.noip2009pj 道路遊戲 game.pas cpp 比較難的dp 設 fi,j,0表示當前第i時刻到達第j個工廠,在這裡並不買機械人的最大金幣數 設 fi,j,1表示當前第i時刻到達第j個工廠,在這裡買乙個機械人的最大金幣數 注意,題目要求每個時刻必須要有乙個機械人,且走的時候是順時...