【发布时间】:2014-06-27 20:26:14
【问题描述】:
我做了代码演示测试“NumberOfDiscIntersections”: https://codility.com/programmers/lessons/4
我得到:性能 = 100% 和正确性 87%
除一项外的所有测试都正常:
overflow
arithmetic overflow tests
为什么我的long long,还不够?我不知道出了什么问题!
#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;
}
}
【问题讨论】:
-
你还有一些
int变量。你确定它们都不会溢出吗? -
向下循环的替代方案:
for(auto i=A.size(); i!=0;) { --i; ...}并考虑@n-m 的评论。