2014-06-15 104 views
0

我做了演示codility測試 「NumberOfDiscIntersections」: https://codility.com/programmers/lessons/4算術溢出

我有:PERF = 100%,正確性87%

所有的測試,但一個都很好:

overflow 
arithmetic overflow tests 

爲什麼我的漫長,不夠?我無法確定哪裏出了問題!

#include <algorithm> 


int solution(const vector<int> &A) 
{ 
    // write your code in C++11 
    vector<long long > vec_max; 
    for(int i = 0; i < A.size(); ++i) 
    { 
     vec_max.push_back(A[i] + i); 
    } 
    std::sort(vec_max.begin(),vec_max.end()); // sort by max 

    int step = 1; 
    int counter = 0; 
    for(int i = A.size() - 1; i > -1; --i) 
    { 
     std::vector<long long>::iterator low; 

     int nb_upper = A.size() - (lower_bound(vec_max.begin(),vec_max.end(), (long long) (i - A[i])) - vec_max.begin()); 
     counter += nb_upper - step; 
     ++step; 
    } 

    if (counter > 10000000) 
    { 
     return -1; 
    } 
    else 
    { 
     return counter; 
    } 
} 
+2

你還有一些'int'變量。你確定沒有一個會溢出嗎? –

+1

循環向下的替代方法:'for(auto i = A.size(); i!= 0;){--i; ...}並考慮@ n-m的評論。 – Tobias

回答

2

如果A陣列是非常大的,你可能最終將大指數櫃檯int變量。相比於它

counter += nb_upper - step; 

step變量是相當小的,這有可能在那裏你四溢的變量。

+0

是的,「計數器的最大值」是每個圓盤與每個圓盤相交,我沒有想到它,但有100.000個圓盤,這大概是= 1 +2 + .. + 100.000〜(N^2 + N)/ 2〜5.000 .50.000確實溢出。我經常因爲缺乏極端測試而被搞砸了,這是一個可行性教給我的東西:) – user2346536

+0

是的,如果你有一個自然數和作爲輸入數據,使用高斯公式來估計複雜度(在大O中這將是n^2有界),看到一個32位整數,你只需要達到n = 46340。我認爲這是更高的,因爲你寫了100k –