[编程题] 度度熊回家
时间限制: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 }