2017-01-19 6 views
-1

人は道路を横断しなければならず、ステップごとにエネルギーを得るか、またはいくらか失う(この情報は配列として提供されます)。彼がどのレベルでもエネルギーが1以上であるように、エネルギーの最小量を見つけてください。男に必要な最小量を見つける

しかし、以下のプログラムは常に数値ではなく "エラー"を表示します。あなたが配列の値は簡単ではないものであるならば、それが終了呼び出すため

#include<stdio.h> 
#include<limits.h> 
int main(){ 
    int a[]={10,20,20}; 
    int n = sizeof(a)/sizeof(a[0]); 

    int ans = calldistance(a,n); 
    if(ans==-1) 
     printf("error"); 
    else 
     printf("%d",ans); 
    return 0; 
} 

int calldistance(int a[],int n){ 
    int i,min=INT_MAX; 
    for(i=0;i<n;i++){ 
     min+=a[i]; 
     if(min<1) return -1; 
     else continue; 
    } 
    return min; 
} 
+0

これは古典的なバックトラッキングの問題を感じます。あなたのプログラムは無効で、エラーが発生するはずです。あなたの実際のコードですか?それとも、私たちがあなたのためにそれを解決することを望んで一緒に何かを叩きましたか? – StoryTeller

+0

@StoryTeller再帰は必要ありません。配列を1回だけ通過します。 (私は間違っているかもしれません...) – bolov

+1

誰か_stared_タイトルで、それとも私だけですか? :D –

答えて

1

あなたはいつも-1を返します。

配列の部分和を追跡する必要があります。特に、部分和が負の最小値(またはゼロ)にあるときを知る必要があります。この+ 1の絶対値はあなたの答えです。

合計が1を怒鳴ることはありませんされている場合は、あなたの答えはあなたがmin=INT_MAXを初期化している上記の関数でちょうど1

int calldistance(const int a[], const int n) { 
    int min_partial_sum = 0; 
    int partial_sum = 0; 
    for(int i = 0; i < n; ++i) { 
     partial_sum += a[i]; 
     if(min_partial_sum > partial_sum) 
      min_partial_sum = partial_sum; 
    } 

    if(min_partial_sum < 0) 
     return -min_partial_sum + 1; 

    return 1; 
} 
+0

これは正しい解決法ですか?(初心者のプログラマーであれば尋ねるのは申し訳ありません) – Senbagaraman

+0

@Senbagaraman - 可能な限り多くの入力バリエーションをカバーするかどうかをテストで書いていますか?いいえ、これはあなたの仕事です。私はあなたの問題の声明から理解したことを書きました。それを取るか、それを残す。 – StoryTeller

+0

これは問題ありません。 – Senbagaraman

-1
int calldistance(int a[],int n){ 
    int i,min=INT_MAX; 
    for(i=0;i<n;i++){ 
     min+=a[i]; 
     if(min<1) return -1; 
     else continue; 
    } 
    return min; 
} 

で、あなたも1を追加した場合、それは負の数を返します。 。だからあなたはいつも答えとしてerrorを得ているのです。

+0

min = INT_MINも-1を返します。( – Senbagaraman

+0

なぜmin = INT_MINを追加するのですか?min = 0を入力してください。 –

+0

符号付き整数オーバーフローは未定義の動作 – bolov

関連する問題