Эта программа в основном проверяет два конца данной последовательности интергеров, добавляет наибольшее из двух к R и изменяет знак конца, который мы не выбрали. Повторяет процесс, пока не останется только один номер (который не добавляется к R). В первой строке входных данных указывается количество промежуточных элементов в последовательности, а в оставшихся — сама последовательность.
Например, если мы введем «5 5 4 3 2 1», мы должны получить «14», потому что только «1» не добавляется к R.
По какой-то причине, когда я ввожу «5 -5 -4 -3 -2 -1», я получаю вывод «10» вместо «-10».
#include <iostream>
using namespace std;
int main(void) {
int N, *L, R = 0, i = 0, d = 0;
cin >> N;
L = new int[N];
for (; i < N; ++i) cin >> L[i];
i = 0;
d = N - 1;
while (d != i) {
if (L[i] > L[d]){
R += L[i];
L[d] *= -1;
++i;
}
else {
R += L[d];
L[i] *= -1;
--d;
}
}
cout << R << endl;
return 0;
}`
Давайте посмотрим, что происходит во время первых двух итераций. Начнем с:
i = 0
d = 4
L = -5 -4 -3 -2 -1
R = 0
Большой элемент L[d]
Итак, мы добавим это, измените знак L[i]
и декремент d
Итак, теперь мы имеем:
i = 0
d = 3
L = 5 -4 -3 -2 -1
R = -1
Теперь большой элемент L[i]
Итак, мы добавим это, измените знак L[d]
и приращение i
, Итак, теперь мы имеем:
i = 1
d = 3
L = 5 -4 -3 2 -1
R = 4
Как видите, уже после двух итераций результат уже положительный, потому что мы добавили 5
этот раз.
И на всех будущих итерациях мы будем добавлять только числа, которые были сделаны положительными.
Других решений пока нет …