循环数组最大字段和(51Nod-1050)
题目
N个整数组成的循环序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1],a[n],a[1],a[2]这样的序列)。当所给的整数均为负数时和为0。
例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。输入
第1行:整数序列的长度N(2 <= N <= 50000)
第2 - N+1行:N个整数 (-10^9 <= S[i] <= 10^9)输出
输出循环数组的最大子段和。
输入样例
6
-2
11
-4
13
-5
-2输出样例
20
思路:求前缀和后使用双端队列模拟即可
源程序
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#define PI acos(-1.0)
#define E 1e-12
#define INF 0x3f3f3f3f
#define LL long long
const int MOD=1000000007;
const int N=100000+5;
const int dx[]= {-1,1,0,0};
const int dy[]= {0,0,-1,1};
using namespace std;deque<int> Q;
LL sum[N];
LL v[N];
int main() {int n;scanf("%d",&n);Q.clear();sum[0]=0;LL ans=-INF;Q.push_back(0);for(int i=1; i<=n; i++) {scanf("%lld",&v[i]);sum[i]=sum[i-1]+v[i];}for(int i=n+1; i<=2*n; i++) {sum[i]=sum[i-1]+v[i-n];}for(int i=1; i<=2*n; i++) {while(!Q.empty() && Q.front()<i-n)Q.pop_front();ans=max(ans,sum[i]-sum[Q.front()]);while(!Q.empty() && sum[Q.back()]>=sum[i])Q.pop_back();Q.push_back(i);}printf("%lld\n",ans);return 0;
}
循环数组最大字段和(51Nod-1050)相关推荐
- 51nod 1050循环数组最大字段和
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050 思路解析:一开始想着直接将长度为n的数组延长至2n-1 ...
- 51nod 1050 循环数组最大子段和【环形DP/最大子段和/正难则反】
1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该 ...
- 【51nod - 1050】循环数组最大子段和(dp)
题干: N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1], ...
- 1050 循环数组最大子段和
1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该 ...
- 51Nod-1050 循环数组最大段和【最大子段和+最小子段和+DP】
1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+ ...
- 【C++算法与数据结构学习笔记------用循环数组实现队列】
照王晓东<数据结构>(C++语言版)上打的,以备留用. 1 #include <iostream> 2 using namespace std; 3 template<t ...
- 循环数组的最大子段和
问题描述: N个整数组成循环序列,求这个序列的最大子段和. 例如:-2 11 -4 13 -5 -2 ANSWER: 20 解决: 解决这个问题需要有求解最大子段和的基础. 循环数组 ...
- 力扣【下一个更大元素】leetcode-503.下一个更大元素 Ⅱ:单调栈解法+循环数组解法
题目: 思路与解法: 1.如果是暴力法,只需要遍历就可以了,但是那样的话时间复杂度就是O(N^2); 2.可以把这几个数字,抽象成为高度不一样的柱子: 3.寻找的过程,就是从当前柱子去看,被后面的哪一 ...
- 约瑟夫问题的学习(基于循环链表)以及基于循环数组
这是17世纪法国数学家加斯帕在<数目中的游戏问题>讲的一个问题:15个教徒和15个非教徒在海上遇险,必须将一般的人投入海中,其他的人才能幸免于难.与实现各一个办法:30个人围成一个圈,从第 ...
最新文章
- int(1) 和 int(10) 的区别?很多老程序都理解错了!
- 在线代码格式化,在线JSON校验格式化
- python简单体育竞技模拟_Python程序设计思维练习---体育竞技分析-阿里云开发者社区...
- 程序员面试题准备(1)单链表逆置
- leetcode--207. 课程表
- java实现打印等腰三角形
- conda 命令 直接安装 OpenCV[Anaconda]
- car-like robot运动机构简析
- 高并发架构系列:Redis缓存和MySQL数据一致性方案详解
- 中华吸血鬼恶意病毒分析
- 联想x100e linux,联想小红ThinkPad X100e笔记本拆解!
- 库存进销存出入库销售mysql表结构_进销存数据库表结构设计.doc
- 性能优化-图片压缩格式的选择(ETC和ASTC)
- java实现断点续播_vue-video-player 断点续播的实现
- 3dgis java_BIM与三维GIS结合
- Windows 系统服务优化指南
- javaweb图片加载不出来问题的解决方法
- mysql支付账单怎么设计_订单与支付设计
- matlab分频.m,分频器m是什么意思 音响分频器m. TW那个代表高音那个代表是低音?...
- 37种传感器(十)之手指心跳检测模块+Stduino NanoUNO