(二分法)机器人跳跃问题JAVA
按自己的思路写的,但运行时间有点慢了,下面讲思路:
先找到H数组中最大的数为max,然后在[0,max]闭区间上进行二分查找,搜索满足条件的值
要注意的是:当数组很长时,在判断当前二分找到的mid是否满足条件时有可能出现数字过
大而越界的情况,所以我们在判断时统一用java.Math.BigInteger来保存计算。
Java样例
import java.math.BigInteger;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int h[] = new int[n+1];
for(int i=1;i<=n;i++) {
h[i]=sc.nextInt();
}
int max = findMax(h);
//System.out.println("max="+max);
//对[0,max]闭区间进行二分
int l=0,r=max;
while(l<r) {
int mid=l+r>>1;
//System.out.println("mid="+mid+", l="+l+", r="+r);
//System.out.println(mid);
if(judged2(mid,h)) r=mid;
else l=mid+1;
}
System.out.println(r);
}
//判断此时的mid也就是能量能不能走完整个过程
// public static boolean judged(long eng, int[] h) {
// if(eng==75) eng=75;
// for(int i=1;i<h.length;i++) {
// eng = eng*2-h[i];
// System.out.println("eng="+eng);
// if(eng<0) return false;
// }
// return true;
// }
//大数字版本的judge
public static boolean judged2(long e, int[] h) {
BigInteger eng = new BigInteger(e+"");
BigInteger two = new BigInteger("2");
BigInteger temp = null;
for(int i=1;i<h.length;i++) {
temp = new BigInteger(h[i]+"");
eng = eng.multiply(two).subtract(temp);
if(eng.compareTo(BigInteger.ZERO)<0) return false;
}
return true;
}
public static int findMax(int[] h) {
int max=0;
for(int x: h) {
if(x>max) {
max =x;
}
}
return max;
}
}