题目
一个数轴上共有N个点,第一个点的坐标是度度熊现在位置,第N-1个点是度度熊的家。现在他需要依次的从0号坐标走到N-1号坐标。
但是除了0号坐标和N-1号坐标,他可以在其余的N-2个坐标中选出一个点,并直接将这个点忽略掉,问度度熊回家至少走多少距离?
输入
输入一个正整数N, N <= 50。 接下来N个整数表示坐标,正数表示X轴的正方向,负数表示X轴的负方向。绝对值小于等于100
输出
输出一个整数表示度度熊最少需要走的距离。
输入例子
4
1 4 -1 3
输出例子
4
思路
1、这个题目需要看清楚的地方是,度度熊是依次从0号坐标开始走的。笔者一开始没有注意到依次,被坑了很多时间。
2、既然是依次,那么每一段走的距离就是两个点做差的绝对值。
3、那么这个题目的关键问题其实就是如何可以去掉走的路最多的那个点。一个点走的路与前后两个点都有关,所以探讨一个点走的路,需要三个点一起看。
4、比如中间一个点的位置是i,那么不去掉它会走的路程如下:
Math.abs(p[i]-p[i-1])+Math.abs(p[i]-p[i+1])
而去掉它之后所走的路程如下:
Math.abs(p[i-1]-p[i+1])
于是两者做差,算出来的就是去掉之后可以节省的路程。
然后找出能节省的路程最多的那个点。
5、最终的结果就是减去能节省的最多的路程。
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int p[] = new int[n];
for (int i = 0; i < n; i++) {
p[i] = scan.nextInt();
}
int cou=0;
int max=0;
int l;
for(int i=0;i<n-1;i++)
cou+=Math.abs(p[i]-p[i+1]);
for(int i=1;i<n-1;i++){
l=Math.abs(p[i]-p[i-1])+Math.abs(p[i]-p[i+1]);
l-=Math.abs(p[i-1]-p[i+1]);
if(max<l)
max=l;
}
cou-=max;
System.out.println(cou);
}
}