日常刷题2025-2-28

日常刷题2025-2-28

C. Remove the Ends

rating:1300

https://codeforces.com/contest/2064/problem/C

思路:小巧思

拿到一个正数的同时要删除它的所有前缀,拿到一个负数的同时要删除它的所有后缀。首先能想到的是,如果是形如这样的数组

1 1 1 .... -1 -1 -1 。则我们一定能先把左边所有的正数拿完,右边所有的负数拿完,内部的情况是正负数交替出现的情况。

1 -1 1 -1 1 -1 1 -1 。对于这样的数组,如果我们拿了一个正数,则前面所以的负数一定都拿不到。同理,如果我们拿了一个负数,则后面所以的正数我们都拿不到。

猜想一下答案的可能情况。1.是我们拿所以的正数或者所以的负数。2。是正负数都拿了一些,所以我们最后一定是拿了一个最右边的正数和最左边的负数。

代码

#include<bits/stdc++.h>

using i64 = long long;

void DAOQI() {
    int n;
    std::cin >> n;
    std::vector<int> a(n + 1);
    std::vector<std::array<i64, 2>> p(n + 1);
    for (int i = 1; i <= n; i++) {
        std::cin >> a[i];
        p[i] = p[i - 1];
        if (a[i] > 0) p[i][1] += a[i];
        else p[i][0] -= a[i];
    }
    i64 ans = std::max(p[n][0], p[n][1]);
    for (int i = n; i >= 1; i--) {
        ans = std::max(ans, p[i - 1][1] + p[n][0] - p[i - 1][0]);
    }
    std::cout << ans << "\n";
}

signed main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int T = 1;
    std::cin >> T;
    while (T--) DAOQI();
    return 0;
}
posted @ 2025-02-28 09:08  califeee  阅读(77)  评论(0)    收藏  举报