51nod-【循环数组最大子段和】
来源:互联网 发布:北京seo排名优化公司 编辑:程序博客网 时间:2024/05/12 11:43
个代码是ac的但是下面的代码是wa的,希望有人解答,言归正传,
其实对于循环数组的最大子序列的和,只有2种情况 1、最大子序列没有出现首尾相接,直接按照正常方
法做 2、如果首尾相接,我们可以反过来想既然总和是定值,我们假设已经知道首尾相接最大子序列的
和,那剩下的肯定是最小的,并且是在序列的中间,我们直接求出最小值,然后用总和-最小值
不就出来了吗??@_@
ac
#include<cstdio>#define inf 0x3f3f3f3flong long num[50000+11];long long max1(long long a,long long b){if(a>b)return a;return b;}int main(){int n;scanf("%d",&n);long long sum=0;for(int i=1;i<=n;++i){scanf("%lld",&num[i]);sum+=num[i];}long long sum2=0,max=-inf;for(int i=1;i<=n;++i){sum2+=num[i];if(sum2>max)max=sum2;if(sum2<0)sum2=0;}long long min=inf,min2;for(int i=1;i<=n;++i){min2+=num[i]; if(min2<min)min=min2;if(min2>0)min2=0;}printf("%lld\n",max1(max,sum-min));return 0; }
wa
#include<cstdio>#define inf 0x3f3f3f3f __int64 num[50000+11];int main(){__int64 n;scanf("%I64d",&n);for(int i=1;i<=n;++i){scanf("%I64d",&num[i]);num[n+i]=num[i];}__int64 i,sum=0,max=-inf,count;for(i=1;i<=n;++i){count=1;sum=0;for(int j=i;count<=n;++j,++count){sum+=num[j];if(sum>max)max=sum;if(sum<0)sum=0;}}printf("%I64d\n",max); return 0;}
0 0
- 【循环数组最大子段和】51nod 1050 循环数组最大子段和
- 51nod 循环数组最大子段和 (dp)
- 51nod 1050 循环数组最大子段和
- 51nod 1050 循环数组最大子段和 dp
- 51nod循环数组最大子段和
- 51nod 1050 循环数组最大子段和
- 51nod循环数组的最大子段和
- 51nod 1050 循环数组最大子段和
- 51nod-【循环数组最大子段和】
- 51nod 1050 循环数组最大子段和
- 51nod 1050 循环数组最大子段和
- 51nod-1050 循环数组最大子段和
- 51nod 1050 循环数组最大子段和
- 51Nod 1050 循环数组最大子段和
- 51nod 1050 循环数组最大子段和
- 51Nod 1050 循环数组最大子段和
- 51nod 1050 循环数组最大子段和
- 51nod 1050 循环数组最大子段和
- thinkphp3.2.2学习笔记
- UVA10603 Fill
- 日志总结---从common-log、self4j、log4j到logback、logstash
- 炸弹
- 同步方法
- 51nod-【循环数组最大子段和】
- WebStorm操作日志
- http协议特点
- 防止表单重复提交
- 浅谈内存泄漏与内存溢出的区别?
- 金融工程引论--Notes 1
- 并发编程之ThreadLocal
- [SQL] Shutdown is in progress
- Machine Learning--logistic regression