度度熊回家

一个数轴上共有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,2,5},这样,从第一点到第三点的距离为4;当不是递增的时候,如(2,1,5),那我们只要跳过第二点,就可以得到最短距离为3,如何得到这点了?暴力解法,枚举出缺某一点时,可以省下的距离,然后和一步步走的时候距离相减,就可以得到最短的距离。代码如下:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int N;
10     cin >> N;
11     
12     int dist[50];
13     for (int i = 0; i<N; i++)
14     {
15         cin >> dist[i];
16     }
17 
18     int sum = 0, maxDiff = 0;
19     for (int i = 0; i<N - 1; i++)
20     {
21         sum += abs(dist[i] - dist[i + 1]);
22     }
23 
24     int diff = 0;
25     for (int i = 1; i<N - 1; i++)
26     {
27         diff = abs(dist[i - 1] - dist[i]) + abs(dist[i] - dist[i + 1]);
28         diff-=abs(dist[i - 1] - dist[i + 1]);
29         maxDiff = max(maxDiff, diff);        //省下的最大距离
30     }
31     sum -= maxDiff;
32     cout << sum;
33     return 0;
34 }

Ref:

http://m.blog.csdn.net/Double2hao/article/details/72459499

posted @ 2017-08-24 10:41  王大咩的图书馆  阅读(287)  评论(0)    收藏  举报