原题
一个数轴上共有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-1个点是度度熊的家,除了0号坐标和N-1号坐标,其他元素你可以任意选择一个忽略掉,也就是说用例中除了1和3不能动以外,4跟-1可以任意选择一个忽略,而3就是度度熊家的坐标。题中说需要依次的从0号坐标走到N-1号坐标,也就是说如果我忽略掉4,我需要从1先走到-1,再从-1走到3;如果我忽略掉-1,我需要从1走到4,再从4走到3。理解了题的意思,那么接下来就简单了。
解题思想:
每次去掉除第一个点和最后一个点之外的一个点,算出路径,并和当前最短的路径进行比较,保留较小的一个。主函数中for循环结束后,最终保留的路径长度就是所要求的结果。核心算法时间复杂度为O(N*(N-2))
代码:
#include <stdio.h>
#include <math.h>
int count(int spot[],int min,int N){
int i,length=0;
for(i=0;i<N-1;i++){
length=length+fabs(spot[i+1]-spot[i]);
}
if(length<min){
min=length;
}
return min;
}
int main(){
int N;
int i,s,min=65530;
int spot[50];
scanf("%d",&N);
for(i=0;i<N;i++){
scanf("%d",&spot[i]);
}
for(i=1;i<N-1;i++){
s=spot[i];
spot[i]=spot[i-1];
min=count(spot,min,N);
spot[i]=s;
}
printf("%d",min);
}