2、度度熊回家--百度2017春招

[编程题] 度度熊回家
时间限制:1秒
空间限制:32768K
一个数轴上共有N个点,第一个点的坐标是度度熊现在位置,第N-1个点是度度熊的家。现在他需要依次的从0号坐标走到N-1号坐标。
但是除了0号坐标和N-1号坐标,他可以在其余的N-2个坐标中选出一个点,并直接将这个点忽略掉,问度度熊回家至少走多少距离? 
输入描述:
输入一个正整数N, N <= 50。
接下来N个整数表示坐标,正数表示X轴的正方向,负数表示X轴的负方向。绝对值小于等于100
 
 
输出描述:
输出一个整数表示度度熊最少需要走的距离。
 
输入例子:
4 1 4 -1 3
 
输出例子:
4
 
解题思路:本题分别求删除第一个点到第n-2个点的distance 然后选出最小的distance
1)采用两层循环,第一层控制删除的点从1-n-2 第二层循环j从1到n-1 求出从0-n-1去掉删除的点的distance
2)其中用k记录当前位置的前一个位置的索引(用k记录原因为可能为j-1 或者j-2 如果j-1删除了则为j-2)
3)使用min_dis记录最小的距离值
注意点:每次二层循环时,记得中间变量distance  以及 k  的重置操作
 
 1 #include <iostream>
 2 #include <cmath>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int n;
 8     while(cin>>n)
 9     {
10         int a[n];
11         for(int i=0;i<n;i++)
12         {
13             cin>>a[i];
14         }
15         int min_dis = 0;
16         int distance = 0;
17         int k = 0;//记录上一位置
18         //从i=1 到i=n-2 每次删除一个
19         for(int i=1;i<=n-2;i++)
20         {
21             distance = 0;
22             k = 0;
23             for(int j=1;j<n;j++)
24             {
25                 if(j == i)//跳过删除那个点的计算
26                 {
27                     continue;
28                 }
29                 distance += abs(a[j]-a[k]);//两点之间距离的算法
30                 k = j;
31             }
32             if(i==1)//最开始的第一个distance赋给min_dis
33             {
34                 min_dis = distance;
35             }
36             //之后distance<min_dis才赋值
37             if(distance < min_dis)
38                 min_dis = distance;
39         }
40         cout<<min_dis<<endl;
41     }
42     return 0;
43 }
 
原文地址:https://www.cnblogs.com/qqky/p/6894549.html