百度2017春招笔试题二——回家

百度2017春招笔试题二——回家

题目来自牛客网,感谢!

从数轴上N个点中移除非首尾的一个,使从首到尾移动的总距离最短。

输入格式

第一行输入N,代表数轴上点的总个数
第二行输入N个数,代表各点的坐标
输入保证 N ≥ 3 N\geq 3 N3

输出格式

第一行输出一个数,代表最短的总距离

输入范例

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}| aiai1+aiai+1,新距离为 ∣ a i − 1 − a i + 1 ∣ |a_{i-1}-a_{i+1}| ai1ai+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=ai1ai+1aiai1+aiai+10
遍历数组,将其中最小亦即绝对值最大的 Δ 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);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值