• 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;
    }

  • 相关阅读:
    2016CCPC长春
    POJ 3974
    CH 1401
    POJ 1426
    hihocoder 1829
    江南OJ 1151
    POJ 3279
    POJ 3349
    POJ 3278
    ZOJ 3983
  • 原文地址:https://www.cnblogs.com/Uiney117/p/14509411.html
Copyright © 2020-2023  润新知