2014-06-15 157 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 –