P7917 [Kubic] Addition【题解】

题目传送门

题意描述:

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

解题思路:

要使剩下来的数最大,我们很容易想到一种贪心思路:因为 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 xy,这时我们的每次操作都保证了
a n s + = max ⁡ ( x + y , x − y ) ans+=\max(x+y,x-y) ans+=max(x+y,xy)

需要注意的是,当第一个数为负数时,我们无法把它变为正数,所以直接累加进答案就行了。最终可以得出: 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=2nabs(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;
}

猜你喜欢

转载自blog.csdn.net/qq_62444770/article/details/121202907