二分 機械人跳躍問題

2021-10-01 20:40:59 字數 2032 閱讀 6467

機械人正在玩乙個古老的基於dos的遊戲。

遊戲中有n+1座建築——從0到n編號,從左到右排列。

編號為0的建築高度為0個單位,編號為 i 的建築高度為h(i)個單位。

起初,機械人在編號為0的建築處。

每一步,它跳到下乙個(右邊)建築。

假設機械人在第k個建築,且它現在的能量值是e,下一步它將跳到第k+1個建築。

如果h(k+1)>e,那麼機械人就失去h(k+1)-e的能量值,否則它將得到e-h(k+1)的能量值。

遊戲目標是到達第n個建築,在這個過程中能量值不能為負數個單位。

現在的問題是機械人以多少能量值開始遊戲,才可以保證成功完成遊戲?

輸入格式

第一行輸入整數n。

第二行是n個空格分隔的整數,h(1),h(2),…,h(n)代表建築物的高度。

輸出格式

輸出乙個整數,表示所需的最少單位的初始能量值。

資料範圍

1≤n,h(i)≤105,

輸入樣例1:

5

3 4 3 2 4

輸出樣例1:

4
輸入樣例2:

3

4 4 4

輸出樣例2:

4
輸入樣例3:

3

1 6 4

輸出樣例3:

3
題目大概說了個什麼意思呢,前面有不同高度的樓,機械人開始從當前位置跳躍,自身有乙個能量值,每次跳躍的時候會進行判斷

如果目前「能量》高度」

那麼跳躍之後的能量值就變成了(能量 + (能量 - 高度))

如果目前「能量《高度」

那麼跳躍之後的能量值就變成了(能量 - (高度 - 能量))

看起來跟樓層高度差好像沒什麼關係,不是平常的爬幾層消耗幾格能量,一開始還挺懵逼的,高中的時候數學老師告訴我,不管會不會,別光看,動筆算一算,看看自己到底是死在哪,於是設當前的能量是e推算一下

舉個栗子

用測試資料3 4 3 2 4來舉例,當前在第乙個位置,能量是e,那麼跳下乙個位置以後的能量,有兩種可能,一種是e < 4;一種是e > 4

但是最後的結果都是2e - 4;於是乎發現了每一次跳躍之後,能量都會變成2e - h

有了這個結論就好說了,資料範圍給的是0 ~ 100000;我們用二分法來找到最合適的那個資料值,每次找到乙個之後,就推算一遍看看這個能量值能不能跳到最後(跳到最後的條件就是能量值不會為負數)。**如下:

#include

#include

#include

#include

using

namespace std;

const

int n =

100010

;int q[n]

;//這個函式用來判斷當前的能量值能不能跳到最後,最終返回值也是看正數還是負數

intget

(long

long e,

int len)

return1;

}int

main()

cout << l << endl;

return0;

}

注:因為能量值最初也是會從50000開始,如果資料樓層比較低的地方,那麼他不斷的疊加能量,就會爆int,long long也會爆,就會出現能量太多導致負數的情況,所以在get函式中增加乙個判斷,如果當前的能量遠大於樓層的高度,就直接return了

還有一點,因為最後我們要的是大於0的哪乙個結果,所以判斷條件用的是 「>0」

演算法 機械人跳躍問題(二分)

因為當向上走的時候,它會失去能量故e e h k 1 e e e h k 1 e e e h k 1 e 當向下走的時候,會增加能量e e e h k 1 e e e h k 1 e e e h k 1 故可以整理得到e 2 e h k 1 e 2 e h k 1 e 2 e h k 1 因此我們可...

機械人跳躍問題

機械人正在玩乙個古老的基於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個建築...