题目

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)相关推荐

  1. 51nod 1050循环数组最大字段和

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050 思路解析:一开始想着直接将长度为n的数组延长至2n-1 ...

  2. 51nod 1050 循环数组最大子段和【环形DP/最大子段和/正难则反】

    1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该 ...

  3. 【51nod - 1050】循环数组最大子段和(dp)

    题干: N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1], ...

  4. 1050 循环数组最大子段和

    1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该 ...

  5. 51Nod-1050 循环数组最大段和【最大子段和+最小子段和+DP】

    1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+ ...

  6. 【C++算法与数据结构学习笔记------用循环数组实现队列】

    照王晓东<数据结构>(C++语言版)上打的,以备留用. 1 #include <iostream> 2 using namespace std; 3 template<t ...

  7. 循环数组的最大子段和

    问题描述: N个整数组成循环序列,求这个序列的最大子段和. 例如:-2   11  -4  13  -5  -2    ANSWER: 20 解决: 解决这个问题需要有求解最大子段和的基础. 循环数组 ...

  8. 力扣【下一个更大元素】leetcode-503.下一个更大元素 Ⅱ:单调栈解法+循环数组解法

    题目: 思路与解法: 1.如果是暴力法,只需要遍历就可以了,但是那样的话时间复杂度就是O(N^2); 2.可以把这几个数字,抽象成为高度不一样的柱子: 3.寻找的过程,就是从当前柱子去看,被后面的哪一 ...

  9. 约瑟夫问题的学习(基于循环链表)以及基于循环数组

    这是17世纪法国数学家加斯帕在<数目中的游戏问题>讲的一个问题:15个教徒和15个非教徒在海上遇险,必须将一般的人投入海中,其他的人才能幸免于难.与实现各一个办法:30个人围成一个圈,从第 ...

最新文章

  1. int(1) 和 int(10) 的区别?很多老程序都理解错了!
  2. 在线代码格式化,在线JSON校验格式化
  3. python简单体育竞技模拟_Python程序设计思维练习---体育竞技分析-阿里云开发者社区...
  4. 程序员面试题准备(1)单链表逆置
  5. leetcode--207. 课程表
  6. java实现打印等腰三角形
  7. conda 命令 直接安装 OpenCV[Anaconda]
  8. car-like robot运动机构简析
  9. 高并发架构系列:Redis缓存和MySQL数据一致性方案详解
  10. 中华吸血鬼恶意病毒分析
  11. 联想x100e linux,联想小红ThinkPad X100e笔记本拆解!
  12. 库存进销存出入库销售mysql表结构_进销存数据库表结构设计.doc
  13. 性能优化-图片压缩格式的选择(ETC和ASTC)
  14. java实现断点续播_vue-video-player 断点续播的实现
  15. 3dgis java_BIM与三维GIS结合
  16. Windows 系统服务优化指南
  17. javaweb图片加载不出来问题的解决方法
  18. mysql支付账单怎么设计_订单与支付设计
  19. matlab分频.m,分频器m是什么意思 音响分频器m. TW那个代表高音那个代表是低音?...
  20. 37种传感器(十)之手指心跳检测模块+Stduino NanoUNO

热门文章

  1. 华为的数字化转型与数据治理
  2. 玩数据必备Python库:Numpy使用详解
  3. 工作这几年,同事对我的称呼肉眼可见的在变化着......
  4. Docker 从入门到掉坑
  5. 阿里立秋:AI千人千面,淘宝如何做智能化UI测试?
  6. 【技术文档】JEECG整合JXLS步骤与开发
  7. MAVEN自定义项目骨架
  8. MiniDao 比Mybatis还灵活实用的J2EE 持久层轻量级解决方案
  9. 什么情况导致全表扫描,而不是用索引 收藏
  10. 读书笔记—《销售铁军》随记7