该程序基本上检查给定整数序列的两端,将两者中最大的一个加到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;
}`
答案 0 :(得分: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
。
在未来的所有迭代中,我们只会添加积极的数字。