注意
1.题目涉及到最大/小
这类描述,思考顺序:二分->DFS->DP->贪心
2.若$E_0、E_1、\cdots、E_n$为攀爬过程中满足非负条件的一组能量值,则对任意的$E_0’>E_0$,由数学归纳法推导有$E_1’=2*E_0’-h_1\geqslant 2*E_0-h_1=E_1;E_i’=2E_{i-1}’-h_{i}\geqslant E_{i-1}-h_i=E_i$,即对于满足要求的初始值E,是具有单调性特征
的,便可用二分求解
3.$E_i$在递归时,当$E_i$达到或超过所读入的$h_j$的最大值后,后续的$E_{i+j}$一定是非负的($2E_i-h_{max}\geqslant E_i>0$),故可以设定一个能量最大值限度
为高度最大值或者题目给的高度数据范围最大值1e5,这样可以避免不必要的后续判断
(后面的楼层跳跃在此基础上一定是满足条件的),同时又可以避免爆掉数据范围
代码
#include <bits/stdc++.h>
using namespace std;
int N;
const int num = 100010;
int h[num];
bool check(int e)
{
for (int i = 1; i <= N; i++)
{
e = 2 * e - h[i];
if (e >= 1e5)
return true;
if (e < 0)
return false;
}
return true;
}
int main()
{
scanf("%d", &N);
int tmp = N;
while (tmp--)
scanf("%d", &h[N - tmp]);
int l = 0, r = 1e5;
while (l < r)
{
int mid = l + r >> 1;
if (check(mid))
r = mid;
else
l = mid + 1;
}
printf("%d", l);
return 0;
}