算法之度度熊回家

原題

一個數軸上共有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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章