日常刷题2025-2-28
日常刷题2025-2-28
C. Remove the Ends
rating:1300
思路:小巧思
拿到一个正数的同时要删除它的所有前缀,拿到一个负数的同时要删除它的所有后缀。首先能想到的是,如果是形如这样的数组
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;
}

浙公网安备 33010602011771号