日常刷题2025-2-28
1.日常刷题2025-3-162.日常训练2025-1-23.日常训练2025-1-34.日常训练2025-1-55.日常训练2025-1-86.日常训练2025-1-117.日常训练2025-1-128.日常训练2025-1-139.日常训练2025-1-1410.日常训练2025-1-1511.日常训练2025-1-1612.日常训练2025-1-1713.日常训练2025-1-1814.日常训练2025-1-1915.日常训练2025-1-2116.日常训练2025-1-2217.日常刷题2025-1-2318.日常训练2025-1-2419.日常刷题2025-1-2520.日常刷题21.日常刷题2025-2-622.日常刷题2025-2-923.日常刷题2025-2-1424.日常刷题2025-2-1525.日常刷题2025-2-1726.日常刷题2025-2-2027.日常刷题2025-2-2128.日常刷题2025-2-2229.日常刷题2025-2-2430.日常刷题2025-2-2631.日常刷题2025-2-27
32.日常刷题2025-2-28
33.日常刷题2025-3-134.日常刷题2025-3-235.日常刷题2025-3-336.日常刷题2025-3-537.日常刷题2025-3-638.日常刷题2025-3-739.日常刷题2025-3-840.日常刷题2025-3-941.日常刷题2025-3-1042.日常刷题2023-3-1143.日常刷题2025-3-1344.非常棒的二分和DP日常刷题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; }
本文作者:califeee
本文链接:https://www.cnblogs.com/califeee/p/18742556
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步