程式設計題 機械人跳躍問題

2021-10-22 10:12:24 字數 2252 閱讀 2257

機械人正在玩乙個古老的基於dos的遊戲。遊戲中有n+1座建築——從0到n編號,從左到右排列。編號為0的建築高度為0個單位,編號為i的建築的高度為h(i)個單位。

起初, 機械人在編號為0的建築處。每一步,它跳到下乙個(右邊)建築。假設機械人在第k個建築,且它現在的能量值是e, 下一步它將跳到第個k+1建築。它將會得到或者失去正比於與h(k+1)與e之差的能量。如果 h(k+1) > e 那麼機械人就失去 h(k+1) - e 的能量值,否則它將得到 e - h(k+1) 的能量值。

遊戲目標是到達第個n建築,在這個過程中,能量值不能為負數個單位。現在的問題是機械人以多少能量值開始遊戲,才可以保證成功完成遊戲?

輸入描述:

第一行輸入,表示一共有 n 組資料.

第二個是 n 個空格分隔的整數,h1, h2, h3,..

., hn 代表建築物的高度

輸出描述:

輸出乙個單獨的數表示完成遊戲所需的最少單位的初始能量
示例:

輸入53

4324

輸出4

解析:

能量的盈虧的狀況分為兩種:

e(k)=e(k-1)-(h(k)-e(k-1))=2e(k-1)-h(k) e(k-1)得無論下一根柱子高度如何,e(k)永遠是上一次能量e(k-1)的兩倍減去下一根柱子長度->e(k)=2e(k-1)-h(k)

所以我們可以進行逆推,由在最後的第n根柱子上所有的能量逐步推出上一根直至我們所求的第0根上的能量。

歸納步驟:

e

(n)=

2e(n-1)

-h(n)=2*

(2e(n-2)-

h(n-1)

)-h(n)=2

^2*(

2e(n-3)

-h(n-2)-

2h(n-1)

-h(n)……=2

^n*e(0

)-2^

0*h(n-0)

-2^1

*h(n-1

)……-2^

(n-1)*

h(n-

(n-1))

=2^n*e(0

)-sum(2^

(k)*

h(n-k)

) k取[

0,n-

1]

由於能量數額為非負數,所以有:

e

(n)=

2^n*e(

0)-sum(2

^(k)*h

(n-k)

)≧0 k取[

0,n-

1]

則有:

2

^n*e(0

)≧sum(2

^(k)*h

(n-k)

) k取[

0,n-

1]

然後兩邊同時除以2^n,有:

e(0

)≧sum(2

^(k)*h

(n-k))/

2^n=sum(2

^(k)/2

^n*h

(n-k))=

sum(

h(n-k)/2

^(n-k) k取[

0,n-

1]

變換一下,即:

e(0

)≧sum(h

(i)/

2^i) i取[

1,n]

顯然這裡面存在浮點數,因為能量不能取負數,所以應當對答案向上取整:

**:

#include

#include

using

namespace std;

intmain()

//用int()+1的話有失誤的可能-->98%

ans =

ceil

(sum)

; cout << ans;

return0;

}

附錄:

c++中浮點數取整有一下四種方法:floor()、ceil()、round()、int()。它們都在cmath標頭檔案下定義,使用時需引入。

其中:floor(x):向下取整,取小於等於x的整數

ceil(x):向上取整,取大於等於x的整數

round(x):對x進行四捨五入

int(x):取x的整數部分

程式設計題 機械人跳躍問題

時間限制 c c 1秒,其他語言2秒 空間限制 c c 32m,其他語言64m 機械人正在玩乙個古老的基於dos的遊戲。遊戲中有n 1座建築 從0到n編號,從左到右排列。編號為0的建築高度為0個單位,編號為i的建築的高度為h i 個單位。起初,機械人在編號為0的建築處。每一步,它跳到下乙個 右邊 建...

機械人跳躍問題

機械人正在玩乙個古老的基於dos的遊戲。遊戲中有n 1座建築 從0到n編號,從左到右排列。保證編號為0的建築高度為0個單位。編號為i的建築 i 1,n 的高度為hi個單位。起初,機械人在編號為0的建築處。每一步,它跳到下乙個 右邊 建築。假設機械人在第k個建築,且他現在的能量值是botenergy,...

機械人跳躍問題

機械人正在玩乙個古老的基於dos的遊戲。遊戲中有n 1座建築 從0到n編號,從左到右排列。編號為0的建築高度為0個單位,編號為 i 的建築高度為h i 個單位。起初,機械人在編號為0的建築處。每一步,它跳到下乙個 右邊 建築。假設機械人在第k個建築,且它現在的能量值是e,下一步它將跳到第k 1個建築...