Zadanie z Codility:
Let A be a non-empty zero-indexed array consisting of N integers.
The abs sum of two for a pair of indices (P, Q) is the absolute value |A[P] + A[Q]|, for 0 ≤ P ≤ Q < N.
For example, the following array A:
A[0] = 1
A[1] = 4
A[2] = -3
has pairs of indices (0, 0), (0, 1), (0, 2), (1, 1), (1, 2), (2, 2).
The abs sum of two for the pair (0, 0) is A[0] + A[0] = |1 + 1| = 2.
The abs sum of two for the pair (0, 1) is A[0] + A[1] = |1 + 4| = 5.
The abs sum of two for the pair (0, 2) is A[0] + A[2] = |1 + (−3)| = 2.
The abs sum of two for the pair (1, 1) is A[1] + A[1] = |4 + 4| = 8.
The abs sum of two for the pair (1, 2) is A[1] + A[2] = |4 + (−3)| = 1.
The abs sum of two for the pair (2, 2) is A[2] + A[2] = |(−3) + (−3)| = 6.
Write a function:
int solution(vector<int> &A);
that, given a non-empty zero-indexed array A consisting of N integers, returns the minimal abs sum of two for any pair of indices in this array.
For example, given the following array A:
A[0] = 1
A[1] = 4
A[2] = -3
the function should return 1, as explained above.
Given array A:
A[0] = -8
A[1] = 4
A[2] = 5
A[3] =-10
A[4] = 3
the function should return |(−8) + 5| = 3.
Assume that:
N is an integer within the range [1..100,000];
each element of array A is an integer within the range [−1,000,000,000..1,000,000,000].
Complexity:
expected worst-case time complexity is O(N*log(N));
expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments).
Elements of input arrays can be modified.
Copyright 2009–2015 by Codility Limited. All Rights Reserved. Unauthorized copying, publication or disclosure prohibited.
Moje rozwiazanie:
using namespace std;
#include <vector>
#include <iterator>
#include <algorithm>
#include <numeric>
int solution(vector<int> &A)
{
// write your code in C++11
if (A.size() == 0)
{
return 0;
}
else if (A.size() == 1)
{
return A[0];
}
else
{
int minimum{ numeric_limits<int>::max() };
int current_sum{ 0 };
for (auto beg{ cbegin(A) }, end{ cend(A) }; beg != end; ++beg)
{
auto tmp_beg{ beg };
auto tmp_end{ next(tmp_beg) };
while (tmp_end != end)
{
current_sum = abs(*tmp_beg + *tmp_end);
if (current_sum < minimum)
{
minimum = current_sum;
}
++tmp_end;
}
}
return minimum;
}
}
Dostaje blad, mowiacy:
The following issues have been detected: wrong answers, timeout errors.
For example, for the input [1000000000] the solution returned a wrong answer (got 1000000000 expected 2000000000).
Ja sie kura pytam, jak moze z jednego wejscia 1'000'000'000 spodziewac sie 2'000'000'000? Jak to kuwa mozliwe?
Jesli ktos chce ten kod wrzucic na Codility to trzeba zmienic ten powyzszy kod na ten (to jest ten sam kod tylko inicjalizacja jest przed C++11 lub C++14):
using namespace std;
#include <vector>
#include <iterator>
#include <algorithm>
#include <numeric>
int solution(vector<int> &A)
{
// write your code in C++11
if (A.size() == 0)
{
return 0;
}
else if (A.size() == 1)
{
return A[0];
}
else
{
int minimum{ numeric_limits<int>::max() };
int current_sum{ 0 };
for (auto beg = A.cbegin(), end = A.cend(); beg != end; ++beg)
{
auto tmp_beg = beg ;
auto tmp_end = next(tmp_beg) ;
while (tmp_end != end)
{
current_sum = abs(*tmp_beg + *tmp_end);
if (current_sum < minimum)
{
minimum = current_sum;
}
++tmp_end;
}
}
return minimum;
}
}
std::
albojakasdluganazwa::
w plikachcpp
to wykitowałbym