今日頭條2019,筆試題 機械人跳躍問題

2021-10-03 18:03:28 字數 1641 閱讀 9665

演算法標籤: 二分,遞推

題目描述

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

有題目可知

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

整理得到e = 2*e - h

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

則必定存在值x,當任意值滿足x即完。

我們可以用二分找出指定的最小值,且由於是最小值,必然存在if(check(mid))r=mid;else l=mid+1;.

現在我們轉為探求check函式。

即只要最後的值大於》0就代表該數值成立。

由此我們得到了if e > 0 return trueelse if e<0 return false

因為e=2e-h,過程中很可能爆int32.

又因為數值過大可能存在爆int的風險。

已知 e = 2e-h = e+e-h

將e 縮放為 maxh maxh = n,則有》0,則此後的數列必然為遞增

由此我們得到if(e>=n) return true;

這同時也是為了解決計算時出現的e大於int32位的問題

c++ **

#include

using

namespace std;

const

int n=

1e5+10;

int h[n]

,n;int

check

(int x)

return

true;}

intmain()

cout

}

今日頭條2018 筆試題2

定義兩個字串變數 s,m,再定義兩種操作,第一種操作 m ss s s 說明 s只會變為原來的2倍 第二中操作 s s m 假設s,m初始化如下 s a m s求最小的操作步驟數,可以將s拼接到長度等於n。示例1 輸入6,輸出3 示例2 輸入4,輸出2 思路 第一種操作,s變為原來的1倍 說明偶數的...

2017 08 22 今日頭條筆試題

有乙個值得分享的地方,是x排序之後對應y的問題 我用了乙個很大的陣列,以x為索引,y為陣列值,不需要用到map。其實也是因為我懶不想去學map操作了,下次試試用map。include include include using namespace std int main cin n x.clear...

今日頭條筆試題(一)

一列火車有n個車廂標記為1,2,3,4,5,6 n 現在因為某些原因,需要調整車廂的相對順序 例如需要將車廂順序調整為2,3,1,4,5,6 n 由於車廂龐大,且車廂只能停留在鐵軌上,所以不能隨心所欲的調整相對順序 現在只能利用兩條並行的鐵軌對車廂的順序進行調整 例如原序列為1,2的車廂 車廂1進入...