[Kubic] Addition

题目背景

建议先看 B 题题目背景。

题目描述

有一个初始长度为 nnn 的序列 aaa。你需要进行 n−1n-1n1 次操作。每一次操作先在当前序列中选出两个相邻的数 x,yx,yx,y 并删除(原序列中 xxxyyy 左边),再往原位置插入一个 x+yx+yx+y 或一个 x−yx-yxyn−1n-1n1 次操作之后最终只会剩下恰好一个数,求这个剩下的数的最大值。

输入格式

第一行,一个整数 nnn

第二行,共 nnn 个整数 iii 个表示 aia_iai

输出格式

共一行,一个整数,表示答案。

样例 #1

样例输入 #1

5
-1 1 1 -1 1

样例输出 #1

3

提示

对于 100%100\%100% 的数据,1≤n≤105,∣ai∣≤1091\le n\le 10^5,|a_i|\le 10^91n105,ai109

分值nnn∣ai∣\vert a_i\vertai特殊性质
Subtask⁡1\operatorname{Subtask}1Subtask1101010≤2\le 22无特殊限制
Subtask⁡2\operatorname{Subtask}2Subtask2202020≤100\le 100100无特殊限制
Subtask⁡3\operatorname{Subtask}3Subtask3555无特殊限制无特殊限制ai≥0a_i\ge 0ai0
Subtask⁡4\operatorname{Subtask}4Subtask4303030无特殊限制≤1\le 11
Subtask⁡5\operatorname{Subtask}5Subtask5353535无特殊限制无特殊限制

样例解释

一种操作过程如下:

-1 1 1 -1 1

-1 1 1 -2

-1 1 3

-1 4

3

可以证明没有更优的方案。

C++实现

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int n, x, ans;
signed main()
{
scanf(“%lld%lld”, &n, &x);
ans = x;
for (int i = 2; i <= n; i++)
{
scanf(“%lld”, &x);
ans += x < 0 ? -x : x;
}
printf(“%lld\n”, ans);
return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

Logo

2万人民币佣金等你来拿,中德社区发起者X.Lab,联合德国优秀企业对接开发项目,领取项目得佣金!!!

更多推荐