密码测试中的算术溢出

时间:2014-06-15 13:39:56

标签: c++ algorithm

我做了编码演示测试“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;
    }
}

1 个答案:

答案 0 :(得分:2)

如果A数组非常大,您最终可能会向计数器int变量添加大索引。 step变量与

相比非常小
counter += nb_upper - step;

这可能是你在变量溢出的地方。