序列划分

题目描述

给定序列 A[1...N],将序列中的元素 A[i] 分为 2 部分(每部分必须连续,且可以为空),对划分的 2 部分分别统计:左边部分的元素总和 sum1​、右边部分的元素总和 sum2​。

请你求出 (sum1​−sum2​) 的最大值。

输入格式

第一行包含一个整数 N(1≤N≤106),代表序列的长度。

第二行包含 N 个整数 A[i](int 范围)。

输出格式

一个整数,代表 sum1​−sum2​ 的最大值。

样例 #1

样例输入 #1

3
1 0 -2

样例输出 #1

3

样例输入 #2

6
16 23 16 15 42 8

样例输出 #2

120

样例输入 #3

5
3 4 -3 2 -1

样例输出 #3

9

提示

样例 3 说明:sum1​=3+4=7,sum2​=(−3)+2+(−1)=−2

#include <iostream>
using namespace std;

long long s[1000010];
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>s[i];
		s[i]+=s[i-1];
	}
	long long maxn=-1e18;
	for(int i=0;i<=n;i++)//左侧r
	{
		long long sum1=s[i],sum2=s[n]-s[i];
		maxn=max(maxn,sum1-sum2);
	}
	cout<<maxn;
	return 0;
}

这道题平均每次交四五次才能过T-T

这道题是前缀和,题目里如果有“连续”二字,就很可能是前缀和!

今天交了三遍过的,第一遍错了,改了两个long long;第二遍又错了,又改了一个long long。

### 序列划分算法的流程图与图解 序列划分算法是一种在排序和搜索算法中广泛使用的辅助技术。它通过将一个序列分割为多个子序列,从而实现更高效的处理。以下是对序列划分算法的详细说明及流程图的描述。 #### 1. 序列划分算法的基本概念 序列划分算法的核心思想是将一个序列划分为若干个子序列,使得每个子序列满足特定条件。例如,在快速排序中,序列划分为两个子序列:一个包含小于基准值的元素,另一个包含大于等于基准值的元素[^1]。 #### 2. 流程图的结构 以下是序列划分算法的一般流程图结构: ```plaintext 开始 | v 初始化序列和基准值 | v 遍历序列中的每个元素 | v 比较当前元素与基准值 | v 根据比较结果将元素分配到不同的子序列 | v 完成划分后返回子序列 | v 结束 ``` #### 3. 图解示例 以下是一个基于快速排序的序列划分算法的具体图解: 假设初始序列为 `[8, 3, 7, 6, 5, 9]`,选择第一个元素 `8` 作为基准值。 1. 初始化:基准值为 `8`。 2. 遍历序列: - 元素 `3` 小于基准值,放入左侧子序列。 - 元素 `7` 小于基准值,放入左侧子序列。 - 元素 `6` 小于基准值,放入左侧子序列。 - 元素 `5` 小于基准值,放入左侧子序列。 - 元素 `9` 大于基准值,放入右侧子序列。 3. 划分结果:左侧子序列为 `[3, 7, 6, 5]`,右侧子序列为 `[9]`。 最终划分结果如下图所示: ```plaintext 原始序列: [8, 3, 7, 6, 5, 9] 基准值: 8 划分结果: [3, 7, 6, 5] | 8 | [9] ``` #### 4. 实现代码 以下是序列划分算法的一个简单实现(以快速排序为例): ```python def partition(arr, low, high): pivot = arr[high] # 基准值 i = low - 1 # 左指针 for j in range(low, high): if arr[j] < pivot: i += 1 arr[i], arr[j] = arr[j], arr[i] # 交换元素 arr[i + 1], arr[high] = arr[high], arr[i + 1] # 将基准值放到正确位置 return i + 1 # 返回基准值的位置 # 示例调用 arr = [8, 3, 7, 6, 5, 9] low, high = 0, len(arr) - 1 pivot_index = partition(arr, low, high) print("划分结果:", arr, "基准值索引:", pivot_index) ``` #### 5. 总结 序列划分算法在排序和搜索领域中具有重要作用。通过将序列划分为多个子序列,可以显著提高算法的效率。上述流程图和图解展示了序列划分的基本原理及其应用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值