字节跳动2019春招试题七——机器人跳跃
题目来自牛客网,感谢!
现在有编号为0到N的N+1座建筑,编号为0的建筑高度为0个单位,编号为i的建筑的高度为Hi个单位。
起初,机器人在编号为0的建筑处,每一步跳到下一个建筑。假设机器人在k号建筑,且它当前能量值是E,下一步它将跳到k+1号建筑。它将按Hk+1与E之差得到或者失去能量。如果Hk+1>E那么机器人就失去Hk+1-E的能量值,否则它将得到E-Hk+1的能量值。
机器人的目标是到达N号建筑,在这个过程中,能量值不能为负数。请问机器人出发的最少能量。
输入格式:
第一行输入N,代表有N组数据
第二行输入N个以空格分隔的整数,H1、H2、H3、…、Hn分别代表对应序号建筑的高度
输出格式:
第一行输出完成游戏所需的最少单位的初始能量
输入范例:
3
1 6 4
输出范例:
3
这道题在代码上没有难度,难度主要在数学上。
根据建筑k到建筑k+1跳跃过程中的能量改变规则,可以得到
E
k
+
1
=
2
E
k
−
H
k
+
1
E_{k+1}=2E_k-H_{k+1}
Ek+1=2Ek−Hk+1。由
E
0
=
E
E_0=E
E0=E及
E
k
+
1
≥
0
E_{k+1}\geq 0
Ek+1≥0,得到
E
k
+
1
=
2
(
2
(
…
(
2
E
−
H
1
)
…
−
H
k
)
−
H
k
+
1
≥
0
E_{k+1}=2(2(…(2E-H_1)…-H_k)-H_{k+1}\geq 0
Ek+1=2(2(…(2E−H1)…−Hk)−Hk+1≥0
简化得到
E
k
+
1
=
2
k
+
1
E
−
(
2
k
H
1
+
2
k
−
1
H
2
+
…
+
h
k
+
1
)
≥
0
E_{k+1}=2^{k+1}E-(2^kH_1+2^{k-1}H_2+…+h_{k+1})\geq 0
Ek+1=2k+1E−(2kH1+2k−1H2+…+hk+1)≥0
从而
E
≥
2
k
H
1
+
2
k
−
1
H
2
+
…
+
h
k
+
1
2
k
+
1
=
∑
i
=
1
k
+
1
2
−
i
H
i
E\geq \frac{2^kH_1+2^{k-1}H_2+…+h_{k+1}}{2^{k+1}}=\sum_{i=1}^{k+1}2^{-i}H_i
E≥2k+12kH1+2k−1H2+…+hk+1=∑i=1k+12−iHi
由于E为一个整数,可以得到
E
=
⌈
∑
i
=
1
k
+
1
2
−
i
H
i
⌉
E=\lceil\sum_{i=1}^{k+1}2^{-i}H_i\rceil
E=⌈∑i=1k+12−iHi⌉
我的代码实现:
import java.util.Scanner;
public class RobotJump {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
double e = 0;
for (int i = 0; i < n; i++)
e += (double) sc.nextInt() * Math.pow(2, -i - 1);
sc.close();
System.out.println((int) Math.ceil(e));
}
}