2012-11-05 54 views
3

我正在做一個程序,它發現最大長度的子數組的總和最接近0. 其實我試圖解決這個問題:http://opc.iarcs.org.in/index.php/problems/DEVIOUS,但是當我提交我的代碼,它只給出了50%的測試用例的正確答案。 我的代碼工作正常,甚至給我自己的測試用例提供了正確的答案,所以我需要一個測試用例來證明我的代碼/算法錯誤,以便我可以在代碼中找到錯誤。我需要一個測試用例來證明我的算法/代碼錯誤

這是我的算法,

  1. 創建一個數組「溫度」等於輸入數組的大小,初始化臨時的,使得溫度[I] =所有元素的總和的所有元素達輸入[I]
  2. 排序陣列溫度,發現的 'i' 在溫度,使得溫度[I-1] - 溫度[i]爲最接近0

這是我的代碼,以從上面的鏈接解決問題。

#include <iostream> 
#include <algorithm> 
#include <stdlib.h> 
#include <limits.h> 

using namespace std; 

struct element{ 
    int index; 
    int value; 
}; 

bool compare(element a, element b){ 
    return a.value < b.value; 
} 

int main(){ 
    int n; 
    cin >> n; 
    int array [n]; 
    element elements[n]; 
    int sum = 0; 

    for(int i = 0 ;i < n; i ++){ 
     cin >> array[i]; 
     sum = sum + array[i]; 
     elements[i].index = i; 
     elements[i].value = sum; 
    } 

    sort(elements,elements+n,compare); 

    int diff = INT_MAX; 
    int i1 = 0,i2 = 0; 
    for(int i = 1;i < n;i ++){ 
     int temp = elements[i].value - elements[i-1].value; 
     if(temp < diff){ 
      diff = temp; 
      i1 = elements[i].index; 
      i2 = elements[i-1].index; 
     } 
     else if(temp == diff){ 
      if(abs(elements[i].index - elements[i-1].index) > abs(i1-i2)){ 
       i1 = elements[i].index; 
      i2 = elements[i-1].index; 
      } 
     } 
    } 

    diff = 0; 
    int s,e; 
    if(i1 >= i2){ 
     e = i1, s = i2+1; 
    }else{ 
     s = i1+1, e = i2; 
    } 

    for(int i = s;i <= e ; i++){ 
     diff = diff+array[i]; 
    } 
    cout << diff << endl; 

    cout << s+1 << " " << e+1; 

    return 0; 
} 

編輯:我發現了一個錯誤,在我的代碼和編輯它,它現在給出正確答案的輸入

+1

我喜歡這個問題! – Caribou

+0

如果你想找到一個子數組,我認爲你必須保持原始數組的順序,所以你不應該對它進行排序。 – Renato

+0

我誤解了它 - 你確實保留了訂單... – Caribou

回答

1

換句話說80%,如果在車站的利潤/損失p1,p2,..., pN部長希望切換一個序列i,i + 1,...,j等 pi + pi + 1 + ... + pj的絕對值最小化。如果有 與這個最小絕對值超過一個序列,然後他 想交出最長的一個

我覺得你的算法是稍有不當:

臨時[i] = SUM所有元素多達輸入[I] 排序陣列臨時

的序列的起始很可能比數組的開始另一位置的 - 它可以是一個亞序列不要忘記。

-1 | -2 | 10 | 5 |-10 | 6 

    | | | x | x | x 

EDIT2:刪除了錯誤的解釋,現在我看了一下代碼 -

if(temp < diff){ 
     diff = temp; 
     i1 = elements[i].index; 
     i2 = elements[i-1].index; 
    } 

你確實有-ve數(虧損)的偏好。難道是未命中的地方有一個更接近零的地方,因爲它或者稍微小於-ve或者+ ve(但是abs值越小)?

+0

雖然對於某個問題很好的回答,但這不是_this_問題的答案! –

+0

@LightnessRacesinOrbit:P第一個報價,如果從鏈接 - 或者我犯了一個基本錯誤(除了回覆這個 - 鴨子的封面) – Caribou

+0

我沒有正確理解你的答案,但你的測試用例證明我的代碼錯誤!謝謝! – 2147483647