原題
一個數軸上共有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);
}