【二分】【基础】AcWing 730. 机器人跳跃问题
原题:https://www.acwing.com/problem/content/732/
思路:首先判断其二段性和单调性,可以二分。二分的上界是题中给出的1e5或者是数据中的最大值,下界是0或者数据中的最小值。判断条件时,根据题目计算每一步的能量值,为了防止爆int,如果任意一次能量超过了最大值,一定可以过,返回true;小于最小值,返回false;最后返回true。数据使用int即可。
1 #include <cstdio> 2 using namespace std; 3 4 const int N = 1e5 + 5; 5 6 int n; 7 8 int a[N]; 9 10 //一定要考虑清楚边界 11 //二分的上界是题目中的1e5,下界是零, 12 //超过这个数字就不用再判断,若超过上界可能会爆掉 13 bool jump(int E) 14 { 15 for(int i = 0;i < n;i++) 16 { 17 E = 2*E - a[i]; 18 if(E < 0) return false;//中间可能小于零 19 if(E > 1e5) 20 { 21 //printf("overflow\n");//不加这个会WA 22 return true; 23 } 24 } 25 return true; 26 } 27 28 int main() 29 { 30 scanf("%d", &n); 31 int L = 0, R = -N; 32 33 for (int i = 0; i < n; i++) 34 { 35 scanf("%d", a + i); 36 if (a[i] > R) 37 R = a[i]; 38 } 39 40 while (L < R) 41 { 42 int mid = (R + L)/2;//这种更新条件不用加一,R = mid - 1,L = mid需要加一 43 if(jump(mid)) R = mid; 44 else L = mid + 1;//重要!不满足一定在L的后面 45 } 46 47 printf("%d\n",R); 48 49 return 0; 50 }

浙公网安备 33010602011771号