PAT-Apat甲级题1007(python和c++实现)

PTA | 1007 Maximum Subsequence Sum

1007 Maximum Subsequence Sum

作者 CHEN, Yue

单位 浙江大学

Given a sequence of K integers { N1​, N2​, ..., NK​ }. A continuous subsequence is defined to be { Ni​, Ni+1​, ..., Nj​ } where 1≤i≤j≤K. The Maximum Subsequence is the continuous subsequence which has the largest sum of its elements. For example, given sequence { -2, 11, -4, 13, -5, -2 }, its maximum subsequence is { 11, -4, 13 } with the largest sum being 20.

Now you are supposed to find the largest sum, together with the first and the last numbers of the maximum subsequence.

Input Specification:

Each input file contains one test case. Each case occupies two lines. The first line contains a positive integer K (≤10000). The second line contains K numbers, separated by a space.

Output Specification:

For each test case, output in one line the largest sum, together with the first and the last numbers of the maximum subsequence. The numbers must be separated by one space, but there must be no extra space at the end of a line. In case that the maximum subsequence is not unique, output the one with the smallest indices i and j (as shown by the sample case). If all the K numbers are negative, then its maximum sum is defined to be 0, and you are supposed to output the first and the last numbers of the whole sequence.

Sample Input:

10
-10 1 2 3 4 -5 -23 3 7 -21

Sample Output:

10 1 4

 万事开头难,先读题!

 

给定K个整数{ N1,N2,...,NK }。连续子序列被定义为{ Ni,Ni+1,...,其中1≤i≤j≤K。最大子序列(Maximum Subsequence)是一个连续的子序列,它具有最大的元素和。例如,给定序列{-2,11,-4,13,-5,-2 },其最大子序列为{ 11,-4,13 },最大和为20。

现在你应该找到最大的总和,以及最大子序列的第一个和最后一个数字。
输入规范:

每个输入文件包含一个测试用例。每种情况占两行。第一行包含正整数K(≤10000)。第二行包含K个数字,由空格分隔。
输出规格:

对于每个测试用例,在一行中输出最大和,以及最大子序列的第一个和最后一个数字。数字之间必须用一个空格隔开,但行尾不能有多余的空格。如果最大子序列不是唯一的,则输出具有最小索引i和j的子序列(如示例所示)。如果所有的K数都是负数,那么它的最大和被定义为0,你应该输出整个序列的第一个和最后一个数字。

由题目可以提取到以下关键信息:

        1, 给出指定长度的数组,一行输入长度,一行输入数组,最大长度是10000

        2, 要求的结果是:最大连续子数组的和以及这段子数组的起始位置和末尾位置,考虑是差分和前缀和的应用

        3, 如果是全负数数组,需要按照规定的输出规范进行输出

题目分析完之后,现在是手搓代码时间!!!

本题要求很简洁明了,即求最大的连续子数组和,在这里考虑使用差分与前缀和的思想对本题进行求解,同时又需要输出这段子数组的起始位置和末尾位置,因此首先定义两个变量用于记录这两个位置:head和tail,对输入数据进行处理,定义k用于接收数组的长度,对于C++,可以考虑定义长度为10001的数组用于存储,python的列表没有长度限制,因此只需要定于列表生成式对输入进行处理即可。

由于考虑使用差分和前缀和的思想解决本题,因此这里为了方便后续操作,分别对输入数组的下标0位置和前缀和数组的下标为零位置赋初值:0,使得前缀和数组中自下标位置起为“前 [i] 个子数组的和”,至于输入数组赋初值的原因,则是为了配合前缀和数组方便操作。

初始化代码和对于输入的处理部分如下:

python部分:

k = int(input()) # 接收输入
lst = [int(i) for i in input().split()] # 接收输入数组
lst.insert(0,0) # 输入数组下标为0位置赋初值0
sum_ = [0] * (len(lst)+1) # 生成前缀和数组,为了防止索引越界,一般考虑稍微初始化大一点点
for i in range(1, len(lst)):sum_[i] = sum_[i-1] + lst[i] # 计算前缀和数组

C++部分:

    cin >> k;// 接收输入sum_[0] = 0; // 前缀和数组初始值赋0for(int i=1;i<=k; i++){cin>> arr[i]; // 接收输入数组}for(int i=1; i<= k; i++){sum_[i] = sum_[i-1] + arr[i]; // 计算前缀和数组}

接下来是本题解题的核心部分,根据前缀和数组计算连续数组的最大和部分。

        由于初始化前缀和数组第一个元素为0,这里则直接从下标为1的位置开始操作,首先定义用于记录最大和的变量result,初始化为-1,这里因为全负数数组有规定的输出格式,且不需要其他额外的操作,因此为了遍历完前缀和数组后可以分辨出该数组是否为全负数数组,此处初始化为-1而不是0,因为全负数数组其子序列的和不可能为正数,但非全负数数组可能存在全零的情况,故此处不初始化为0,避免对后续造成干扰,细节处应该给予充分考虑,避免造成不必要的代码调试时间的浪费。

        此后,我们使用循环,遍历前缀和数组,初始化一个标记变量lowest,用于记录每次最长子数组发生变化后的起始部分,这里初始化为0,因为0下标对应的元素初始化为0,不纳入考虑,循环遍历时,应当使用前缀和数组的元素对下标为lowest的前缀和数组元素进行相减,比如:对于下标为i的前缀和数组sum[i],与标记位置元素sum[lowest] ,其差值为自下标lowest+1到下标为i这段子数组的和,得到这部分子数组的和,我们可以将其与result进行比较,只要发现结果大于result,则更新result,同时head更新为lowest+1,tail更新为i,即【head , tail】部分即为当前所遍历得到的最大连续子数组和,通过循环不断更新i的位置,最终将得到最大的连续子数组和result,以及其初始位置和结束位置下标,同时需要注意的是:标记lowest并不是一成不变的,需要在每次遍历的时候比较sum[i]以及sum[lowest]的大小,只要sum[i]比sum[lowest]小,则更新lowest的位置为i,这里也不难理解,当被减数sum[i]一定时,只有减数sum[lowest]最小,得到的差才能最大,也就是下标为lowest+1到i这部分子数组的和才能最大,这也是解决连续子数组问题的关键点之一。以下是这部分的代码实现:

python:

res = -1 # 最大连续子数组和
lowest = 0 # 标记位置
head = 0
tail = 0
for end in range(len(lst)):if sum_[end] - sum_[lowest] > res: # 当前计算结果大于之前计算得到的最大连续子数组和,更新res = sum_[end] - sum_[lowest]head = lowest + 1tail = endif sum_[lowest] > sum_[end]: # 保证减数最小lowest = end

C++:

// 初始化对应变量
int lowest=0,result=-1;
int head,tail;for(int end=1; end<=k; end ++){if(sum_[end] - sum_[lowest] > result){ // 当前计算得到的最大连续子数组和大于以前计算的result = sum_[end] - sum_[lowest];head = arr[lowest + 1];tail = arr[end];}if(sum_[lowest] > sum_[end]){ // 保证减数最小lowest = end;}
}

最后是完整的的代码部分:

C++:

#include<bits/stdc++.h>
using namespace std;int k;
int lowest=0,result=-1;
int head,tail;
int arr[1001],sum_[1001];int main(){cin >> k;// 接收输入sum_[0] = 0; // 前缀和数组初始值赋0for(int i=1;i<=k; i++){cin>> arr[i]; // 接收输入数组}for(int i=1; i<= k; i++){sum_[i] = sum_[i-1] + arr[i]; // 计算前缀和数组}for(int end=1; end<=k; end ++){if(sum_[end] - sum_[lowest] > result){result = sum_[end] - sum_[lowest];head = arr[lowest + 1];tail = arr[end];}if(sum_[lowest] > sum_[end]){lowest = end;}}if(result < 0){cout << 0 << " " << arr[1] << " " << arr[k];}else{cout << result << " " << head <<" " << tail;}
}

python:

k = int(input()) # 接收输入
lst = [int(i) for i in input().split()] # 接收输入数组
lst.insert(0,0) # 输入数组下标为0位置赋初值0
sum_ = [0] * (len(lst)+1) # 生成前缀和数组,为了防止索引越界,一般考虑稍微初始化大一点点
for i in range(1, len(lst)):sum_[i] = sum_[i-1] + lst[i] # 计算前缀和数组
res = -1
lowest = 0
head = 0
tail = 0
for end in range(len(lst)):if sum_[end] - sum_[lowest] > res:res = sum_[end] - sum_[lowest]head = lowest + 1tail = endif sum_[lowest] > sum_[end]:lowest = endif res < 0:print("0" + " " + str(lst[1]) + " " + str(lst[k]))
else:print(str(res) + " " + str(head) + " " + str(tail))

最后附上AK截图:

python

C++:

写在后面:

        本题题眼在于“最大连续子数组和”,一般此类题目的解题思路都在于“差分与前缀和”这块,构建前缀和数组,通过“被减数一定,减数最小,差值(最大连续子数组和)最大”思路来进行解题,本题难度适中,核心部分可以当作模板记忆。

        以上就是本题的全部内容,主要在于差分与前缀和思想的应用,对此还不清楚的童鞋可以去详细学习,当然如果您有需要,我可以出一期对于差分与前缀和讲解的文章或视频,您可以评论区留言,如果对于以上内容您有什么意见或建议,欢迎评论区交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/668367.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在建站和小程序方面,公司如何提升客户的体验

在建站和小程序方面&#xff0c;公司可以通过以下几个方面来提升客户的体验&#xff1a; 了解客户需求&#xff1a;在项目开始之初&#xff0c;深入了解客户的业务需求、目标受众、品牌风格等&#xff0c;是至关重要的。通过与客户的深入沟通&#xff0c;可以更好地把握其需求…

2024年第三届能源与环境工程国际会议(CFEEE 2024) | Ei&Scopus双检索

会议简介 Brief Introduction 2024年第三届能源与环境工程国际会议(CFEEE 2024) 会议时间&#xff1a;2024年12月12日-14日 召开地点&#xff1a;澳大利亚凯恩斯 大会官网&#xff1a;CFEEE 2024-2024 International Conference on Frontiers of Energy and Environment Engine…

day42_jdbc

今日内容 0 复习昨日 1 JDBC概述 2 JDBC开发步骤 3 完成增删改操作 4 ResultSet 5 登录案例 0 复习昨日 1 写出JQuery,通过获得id获得dom,并给input输入框赋值的语句 $(“#id”).val(“值”) 2 mysql内连接和外连接的区别 内连接只会保留完全符合关联条件的数据 外连接会保留表…

如何在linux下使用openssl自签https的ip证书配置nginx

《如何在linux下使用openssl自签https的ip证书配置nginx》首发牧马人博客转发请加此提示 如何在linux下使用openssl自签https的ip证书配置nginx 背景 **<<如何在linux下使用openssl自签https的ip证书配置nginx>>**这篇文章的诞生跟上篇&#xfeff;&#xfeff;浅…

antv/x6节点添加鼠标悬浮高亮和删除功能

antv/x6节点添加鼠标悬浮高亮和删除功能 效果鼠标悬浮高亮鼠标移出恢复原状态 效果 鼠标悬浮高亮 this.graph.on(node:mouseenter, ({ node }) > {node.addTools({name: button-remove,args: {x: 100%,y: 0,offset: { x: 0, y: 0 },},})})鼠标移出恢复原状态 this.graph.on(…

Java/Python/Go不同开发语言基础数据结构和相关操作总结-数组篇

Java/Python/Go不同开发语言基础数据结构和相关操作总结 1. Java1.1 静态数组Object[]1.1.1 数据结构和定义方式1.1.2 增加1.1.3 修改1.1.4 查询1.1.5 删除1.1.6 获取元素的位置1.1.7 获取总长度1.1.8 正向排序1.1.9 逆向排序 1.2 动态列表List\<Object>1.2.1 数据结构和…

如何实现冻干机和产品全生命周期的验证和监测?

为什么冻干需要工艺优化和合规性 冻干是制药和生物技术产品的关键工艺&#xff0c;需要精确控制关键的温度和压力参数。通过遵守 GMP 和 FDA 合规性等监管准则&#xff0c;您可以生产出更高质量的产品&#xff0c;避免不必要的浪费&#xff0c;并缩短产品上市时间。 要想在冻干…

Java on Azure Tooling 2024年1月更新|Azure Key Vault 支持、示例项目创建支持及更多

作者&#xff1a;Jialuo Gan - Program Manager, Developer Division At Microsoft 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎来到 2024 年 Java on Azure 工具的首次更新。在本次更新中&#xff0c;我们将介绍对于 Azure Key Vault 支持、基于 Azure 示例项目的创建支…

Python入门指北二十六

Python中如何实现静态类型检查和动态类型检查&#xff1f;你有哪些工具推荐&#xff1f; Python中有许多常用的Web开发框架&#xff0c;每个框架都有其独特的特点和适用场景。以下是一些常用的Web开发框架及其特点&#xff1a; Django&#xff1a; 特点&#xff1a;Django是一…

更换服务器是否需要更换SSL证书?

在互联网时代&#xff0c;随着企业和网站的发展&#xff0c;更换服务器是一种常见的需求。然而&#xff0c;许多网站管理员在更换服务器时是否需要更换SSL证书存在疑虑。本文将就此问题进行探讨&#xff0c;帮助您了解在更换服务器时是否需要更换SSL证书。 1、SSL证书的绑定 SS…

【面试】冲刺春招!每天三十道面试题——Java基础篇(一)

目录 一 JDK 和 JRE 的区分 二 简述编码的作用以及记事本的实现原理 三 基本类型有哪些&#xff1f;分别占据多少空间&#xff1f; 四 java中布尔类型的空间大小是怎么定下来的&#xff1f;为什么不是1bit&#xff0c; 把考虑因素说一下 五 int类型和float类型哪一个精度更…

nohost本地部署

1、安装node Node.js 官方网站下载&#xff1a;https://nodejs.org/en/download/ 2、安装whistle 安装命令为 npm install -g whistle 或 npm install -g cnpm --registryhttps://registry.npm.taobao.org 后&#xff0c;使用 cnpm install -g whistle 来安装 3、插件修改 官方…

线性矩阵不等式LMI与李雅普诺夫Lyapunov稳定性

文章目录 线性矩阵不等式&#xff08;Linear Matrix Inequality&#xff0c;LMI&#xff09;例子 Lyapunov稳定性Schur Complement定义Schur Complement作用/性质利用Schur Complement将LMI和Lyapunov联系起来 线性矩阵不等式&#xff08;Linear Matrix Inequality&#xff0c;…

BUG:docker启动之后直接退出问题

示例如下&#xff1a; 问题排查&#xff1a; 启动命令 sudo docker run --privilegedtrue --runtimenvidia --shm-size80g -v /mmm_data_center:/mmm_data_center -v /imagecenter_new/:/imagecenter_new -v /data1:/data1 -v /mnt/offline_data/:/mnt/offline_data/ --neth…

cesium-测量高度垂直距离

cesium做垂直测量 完整代码 <template><div id"cesiumContainer" style"height: 100vh;"></div><div id"toolbar" style"position: fixed;top:20px;left:220px;"><el-breadcrumb><el-breadcrumb-i…

【51单片机】直流电机实验和步进电机实验

目录 直流电机实验直流电机介绍ULN2003 芯片介绍硬件设计软件设计实验现象 步进电机实验步进电机简介步进电机的工作原理步进电机极性区分双极性步进电机驱动原理单极性步进电机驱动原理细分驱动原理 28BYJ-48 步进电机简介软件设计 橙色 直流电机实验 在未学习 PWM 之前&…

理解Jetpack Compose中的`remember`和`mutableStateOf`

理解Jetpack Compose中的remember和mutableStateOf 在现代Android开发中&#xff0c;Jetpack Compose已经成为构建原生UI的首选工具。它引入了一种声明式的编程模式&#xff0c;极大地简化了UI开发。在Compose的世界里&#xff0c;remember和mutableStateOf是两个非常关键的函…

智慧城市:打造低碳未来,引领城市数字化转型新篇章

在“万物皆可数字化”的新时代浪潮下&#xff0c;智慧城市作为未来城市发展的先锋方向&#xff0c;正在以前所未有的速度和规模重塑我们的城市面貌。 智慧城市不仅是一个技术革新的标志&#xff0c;更是城市治理、民生服务等领域全面升级的重要引擎。 一、智慧城市的多元应用领…

玩家笔记:幻兽帕鲁搭建服务器开服教程

玩转幻兽帕鲁服务器&#xff0c;阿里云推出新手0基础一键部署幻兽帕鲁服务器教程&#xff0c;傻瓜式一键部署&#xff0c;3分钟即可成功创建一台Palworld专属服务器&#xff0c;成本仅需26元&#xff0c;阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…

高频一体式读写器现场应用

一体式读写器将所有组件集成在一个设备内&#xff0c;具有设计紧凑、安装简单、一体读写的特点&#xff0c;可在生产、仓库等领域中应用。高频一体式读写器现场应用 一体式读写器可以在在工业生产线上应用&#xff0c;读取产线设备的各种信息并记录&#xff0c;实现自动化控制和…