#include <iostream> #include <vector> #include <map> #include<algorithm> #include<cmath> #include<cstring> #include<string> using namespace std; #define int long long const int N = 1e5 + 4; vector<int> vec; int n; //方法:二分答案(答案一定位于高度数组的最大值与最小值之间,具有单调性,所以可以采用二分答案) //注意:在机器人跳跃的过程中,甚至可能出现 long 越界的情况,比如 长度为 1000 的 {1, ...., 1}能量初始值为 5 的情况,后面会累加2的幂次,结果很恐怖 //所以需要在 check函数中传入 max参数,用于比较剪枝:当处于某处其能量值大于整个高度数组的最大值的时候,这时候一定能通关,无需进行下一步判断,直接剪枝 bool check(int mid, int max) { int e = mid; for (int i = 0; i < n; i++) { if (vec[i] > e) e -= (vec[i] - e); else e += (e - vec[i]); if (e < 0) return false; if(e >= max) return true; } return true; } signed main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); cin >> n; vec.resize(n); for (int i = 0; i < n; i++) { cin >> vec[i]; } int l = *min_element(vec.begin(), vec.end()), r = *max_element(vec.begin(), vec.end()); while (l <= r) { int mid = (l + r) >> 1; if (check(mid, *max_element(vec.begin(), vec.end()))) r = mid - 1; else l = mid + 1; } cout << l << endl; return 0; }