题意描述:
有一个初始长度为 n n n 的序列 a {a} a。你需要进行 n − 1 n-1 n−1 次操作。每一次操作先在当前序列中选出两个相邻的数 ( x , y ) (x,y) (x,y) 并删除(原序列中 x x x 在 y y y 左边),再往原位置插入一个 x + y x+y x+y 或一个 x − y x-y x−y。 n − 1 n-1 n−1 次操作之后最终只会剩下恰好一个数,求这个剩下的数的最大值。
解题思路:
要使剩下来的数最大,我们很容易想到一种贪心思路:因为 x x x总是在 y y y左边,所以当 y > 0 y>0 y>0时,我们应该选择 x + y x+y x+y,而当 y < 0 y<0 y<0时我们应该选择让 x − y x-y x−y,这时我们的每次操作都保证了
a n s + = max ( x + y , x − y ) ans+=\max(x+y,x-y) ans+=max(x+y,x−y)
需要注意的是,当第一个数为负数时,我们无法把它变为正数,所以直接累加进答案就行了。最终可以得出: a n s = a 1 + ∑ i = 2 n a b s ( a i ) ans=a_1+\sum^{n}_{i=2}abs(a_i) ans=a1+i=2∑nabs(ai)
做一遍循环即可,时间是线性的。代码很简单。
A C C o d e : \color{Blue}{AC\space Code:} AC Code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,x,ans;
signed main()
{
cin>>n;
cin>>x;
ans+=x;
for(int i=1;i<n;i++)
{
cin>>x;
ans+=abs(x);
}
cout<<ans;
puts("");
return 0;
}