51nod1049(最大子段和2)
2024-10-01 03:18:41
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1049
题意:中文题诶~
思路:本题和51nod1049(题解)类似,不同的是本题的数列是一个环;
我们可以这样想,取得最大和的子段有两种情况:
1.从第i个元素到第j个元素,i<=j;
2.从第i个元素到第j个元素,i>j;
第1种情况和1049那题是一样的;
第2种情况我们可以反过来想,所有元素的总和是固定的,若 i~j 能取到最大值,那么 j~i 的和为最小子段和,我们可以用和 1 中类似的方法求出最小子段和,再用所有元素的和减去它就能得到最大值啦;
两种情况取得的最大值中较大着即为答案;
代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std; const int MAXN=1e5+;
ll a[MAXN], b[MAXN], c[MAXN]; ll min(ll a, ll b){
return a>b?b:a;
} ll max(ll a, ll b){
return a>b?a:b;
} int main(void){
ll n, ans=, mm=, mn=, x, num=, cnt=;
cin >> n;
for(int i=; i<=n; i++){
cin >> x;
ans+=x;
a[i]=ans;
if(ans>mm){
b[i]=ans;
mm=ans;
}else{
b[i]=b[i-];
}
if(ans<mn){
c[i]=ans;
mn=ans;
}else{
c[i]=c[i-];
}
}
cout << endl;
for(int i=; i<=n; i++){
num=min(num, a[i]-b[i-]);
cnt=max(cnt, a[i]-c[i-]);
}
ans=ans-num;
cout << (ans>cnt?ans:cnt) << endl;
return ;
}
最新文章
- sublime_text_2 ubuntu下无法输入中文 解决方法
- python FileError
- 【读书笔记】iOS-引用计数
- nodejs端口被占用。
- hdu 5063 Operation the Sequence(Bestcoder Round #13)
- Java GC机制和对象Finalize方法的一点总结
- Python自动生产表情包
- POPTEST 150801 祝大家前途似锦
- python源文件转换成exe问题解决贴
- Jenkins连接Window服务器,上传jar并启动
- GitHub上fork一个项目贡献代码以及同步原作者的修改【转】
- OpenCV——颜色缩减、计时函数、访问像素
- #C++初学记录(sort函数)
- Android开发系列(十七):读取assets文件夹下的数据库文件
- ipad safari 滚动(overflow)解决方案
- 20155210潘滢昊 2016-2017-2 《Java程序设计》第4周学习总结
- zabbix安装配置(2.4.5)
- SQL Loader with utf8
- linq使用 count与sum等
- javascript 数组中出现的次数最多的元素
热门文章
- python3全方位教程
- Java微信小程序开发_00_资源帖
- MessFormat的简单使用
- leetcode 34 Search for a Range(二分法)
- ACM学习历程—BZOJ 2115 Xor(dfs &;&; 独立回路 &;&; xor高斯消元)
- 经过一年时间的沉淀 再次回首 TCP Socket服务器编程 (二)
- AD9各种布线总结
- Random获取不重复随机数
- 基于STM32的三轴数字罗盘HMC5883L模块的测试
- 2.JasperReports学习笔记2-创建简单的报表例子