C. Alternating Subsequence(思维题)

题意:给出一串有正有负的整数,要求找到最大的符合+-+-+-(或者-+-+-+)的最大子序列。注意:该序列可以跳着选,但是顺序不能变。

题解:从头开始加,如果两个数符号相同,就比较大小,选出最大的数加入子序列(最大的数加最大的数当然最大啦)。

ACcode:

 

int n,a[200010],b[200010];//数组太大,建议放main函数外面。
int main()
{
int t;
cin >> t;
while (t--)
{
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
if (a[i] > 0) b[i] = 1;
else b[i] = -1;//另存符号,方便比较
}
int maxn = a[0]; ll sum = 0;
for (int i = 1; i < n; i++)
{
if (b[i] == b[i - 1])//如果符号相同,就比较大小,选最大值求和
{
if (a[i] > maxn)
maxn = a[i];
}
else//如果符号不同,就把之前找到的最大值加入和,寻找改变符号后的新最大值
{
sum += maxn;
maxn = a[i];
}
}
cout << sum+maxn << endl;//这里的maxn是最后一次找到的最大值,也要记得加进去。
}
return 0;
}

 

posted @ 2021-03-10 08:49  Uiney  阅读(47)  评论(0编辑  收藏  举报