演算法標籤: 二分,遞推
題目描述
機械人正在玩乙個古老的基於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 true
,else 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進入...