递推做法
从最后一个柱子向前推进,题目问的是最小的能量,所以到达最后一个柱子的时候能量为0,根据题目给定的递推公式求解前一个柱子的能量
需要注意的地方:
1.上取整,什么时候上取整,结果不是/2有余数的时候才上取整,没有余数就不要上取整
也可以使用ceil函数,但是ceil函数必须处理的是double,否则不会进行取整
除数和被除数必须有一个是小数
for(int i=n-1;i>=0;i--){
double m=b[i+1]+a[i+1];
b[i]=(long) Math.ceil(m/2.0);
}
java 四舍五入的函数时round
2.对于只有一个柱子的特殊元素进行考虑
package day;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class 机器人跳跃问题1 {
/**
* @param args
* @throws IOException
* @throws NumberFormatException
*/
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(bufferedReader.readLine());
int a[]=new int [n+1];
String p[]=bufferedReader.readLine().split(" ");
for(int i=1;i<=n;i++){
a[i]=Integer.parseInt(p[i-1]);
}
long b[]=new long [n+1];
b[n]=0;
for(int i=n-1;i>=0;i--){
long m=b[i+1]+a[i+1];
b[i]=m/2+m%2;
//余数只能是0或者1
}
System.out.println(b[0]);
}
}
算法2 二分
```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
/**
* @param args
* @throws IOException
*/
static int maxh=0;
static int a[];
static int n;
public static boolean check( int k ) {
long res=0;
long t=k;
for(int i=1;i<=n;i++){
res=2*t-a[i];
if(res<0) return false;
if(res >1e5) return true;
t=res;
}
return true;
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
n=Integer.parseInt(bufferedReader.readLine());
a=new int [n+1];
String p[]=bufferedReader.readLine().split(" ");
maxh=0;
for(int i=1;i<=n;i++){
a[i]=Integer.parseInt(p[i-1]);
maxh=Math.max(a[i], maxh);
}
int l=0;
int r=(int) 1e5;
while(l<r){
int mid=l+r>>1;
if(!check(mid)) l=mid+1;
else {
r=mid;
}
}
System.out.println(l);
}
}
````