百度2017春招笔试题二——回家
题目来自牛客网,感谢!
从数轴上N个点中移除非首尾的一个,使从首到尾移动的总距离最短。
输入格式
第一行输入N,代表数轴上点的总个数
第二行输入N个数,代表各点的坐标
输入保证 N ≥ 3 N\geq 3 N≥3
输出格式
第一行输出一个数,代表最短的总距离
输入范例
4
1 4 -1 3
输出范例
4
考虑去掉一个点的过程造成的距离改变是对原距离的一个修正。注意到点
a
i
a_i
ai的原距离为
∣
a
i
−
a
i
−
1
∣
+
∣
a
i
−
a
i
+
1
∣
|a_i-a_{i-1}|+|a_i-a_{i+1}|
∣ai−ai−1∣+∣ai−ai+1∣,新距离为
∣
a
i
−
1
−
a
i
+
1
∣
|a_{i-1}-a_{i+1}|
∣ai−1−ai+1∣,故对原距离的修正值为
Δ
d
i
=
∣
a
i
−
1
−
a
i
+
1
∣
−
∣
a
i
−
a
i
−
1
∣
+
∣
a
i
−
a
i
+
1
∣
≤
0
\Delta d_{i}= |a_{i-1}-a_{i+1}|-|a_i-a_{i-1}|+|a_i-a_{i+1}|\leq 0
Δdi=∣ai−1−ai+1∣−∣ai−ai−1∣+∣ai−ai+1∣≤0
遍历数组,将其中最小亦即绝对值最大的
Δ
d
i
\Delta d_{i}
Δdi附加到总距离上即可求得最小距离。
考虑到对数组的计算仅包含:
①一次遍历(求总距离)
②对第2~N-1个数组元素,对其前后各1个元素进行运算(求修正值)
因此可将两次计算合并,更与数据输入过程合并,同时使用多个独立变量存储3个相邻数据
考虑到3个相邻数据仅为低高低或高低高形式下偏差值不为0,则增加判断
我的代码实现
import java.util.Scanner;
public class GoHome {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int a = 0, b = 0, c = 0;
int distance = 0;
int delta = 0;
for (int i = 0; i < n; i++) {
if (i >= 2)
a = b;
if (i >= 1)
b = c;
c = sc.nextInt();
if (i >= 1)
distance += Math.abs(b - c);
if (i >= 2 && (b > Math.max(a, c) || b < Math.min(a, c)))
delta = Math.max(delta, Math.abs(b - a) + Math.abs(b - c) - Math.abs(a - c));
}
sc.close();
System.out.println(distance - delta);
}
}