【二分】【基础】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 }

 

posted @ 2020-09-23 10:12  褪色回音  阅读(113)  评论(0)    收藏  举报