https://codeforces.com/contest/1882/problem/C
思路
- 从第 3 个数开始的所有正数都可取到.(可手动模拟验证)
- 对于前两个数,若负负,则不取;若正正,则两个都取;若正负,则取第一个;若负正,则在两个都取和都不取之间取较大值。综合起来就是 .
代码
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;
int a[N];
void solve()
{
int n;
cin >> n;
if (n == 1)
{
cin >> a[1];
cout << max(0, a[1]) << endl;
return;
}
for (int i = 1; i <= n; ++i) cin >> a[i];
ll ans = max({0, a[1] + a[2], a[1]}); //--, ++/-+, +-
for (int i = 3; i <= n; ++i) if (a[i] > 0) ans += a[i];
cout << ans << endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--)
{
solve();
}
return 0;
}
总结
这题也属于思维题,代码比较短,但需要一定的思维量,挺有意思的。