機械人跳躍問題

2022-03-14 07:42:47 字數 1457 閱讀 2379

機械人跳躍問題

機械人正在玩乙個古老的基於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)≤10^5\),

輸入樣例1:

5

3 4 3 2 4

輸出樣例1:
4
輸入樣例2:
3

4 4 4

輸出樣例2:
4
輸入樣例3:
3

1 6 4

輸出樣例3:
3
這道題是一道實數域進行二分的題目

比整數二分要好寫,不用考慮邊界死迴圈的問題

只要我們限定住我們的精確度就好了,(乙個while迴圈搞定)

那麼只要大力二分就好了

下面主要來說說check函式的部分

精髓就在check函式,即判斷當前二分的答案是否合法的函式

依據題意,其實就是每次都讓你的e在原來的基礎上先乘2再減去你下乙個要跳去的樓高(拿筆推一下就好)

每次做完這樣一輪運算後,檢查當前的e是否為負數

如果為負數直接return false

否則一直進行,直到進行n輪後還沒退出,那麼我們就返回true

最後用ceil函式向上取整並輸出r即可

#includeusing namespace std;

double h[200000];

int n;

bool check(double mid)

}return true;

}int main()

double l=0;

double r=1e8;

while(r-l>0.00001)

else l=mid;

}cout

}

機械人跳躍問題

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

機械人跳躍問題

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