2017-01-19 39 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

有沒有人在標題上標記過,還是隻有我? :D –

回答

1

你總是返回-1因爲你調用它退出,如果數組是一其中值是不平凡的。

你需要跟蹤陣列的部分和。特別是您需要知道部分總和何時處於其最低負值(或零)。這個+1的絕對值就是你的答案。

如果總和永遠波紋管1,那麼你的答案僅僅是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; 
} 

在要初始化min=INT_MAX,如果你連加1,它會返回一個負數上述功能。這就是爲什麼你總是得到error作爲答案。

+0

min = INT_MIN也返回-1 :( – Senbagaraman

+0

爲什麼添加min = INT_MIN,只要把min = 0 –

+0

有符號整數溢出是未定義行爲 – bolov