日常刷题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;
}

本文作者:califeee

本文链接:https://www.cnblogs.com/califeee/p/18742556

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   califeee  阅读(24)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.