企业做网站有用吗,wordpress调用页面名称,网站建设合同的内容与结构,深圳官方网站制作Problem Descrption
给定K个整数的序列{ N1, N2, ..., NK }#xff0c;其任意连续子序列可表示为{ Ni, Ni1, ..., Nj }#xff0c;其中 1 i j K。最大连续子序列是所有连续子序列中元素和最大的一个#xff0c; 例如给定序列{ -2, 11, -4, 13, -5, -2 }其任意连续子序列可表示为{ Ni, Ni1, ..., Nj }其中 1 i j K。最大连续子序列是所有连续子序列中元素和最大的一个 例如给定序列{ -2, 11, -4, 13, -5, -2 }其最大连续子序列为{ 11, -4, 13 }最大和 为20。 在今年的数据结构考卷中要求编写程序得到最大和现在增加一个要求即还需要输出该 子序列的第一个和最后一个元素。
Input
测试输入包含若干测试用例每个测试用例占2行第1行给出正整数K( 10000 )第2行给出K个整数中间用空格分隔。当K为0时输入结束该用例不被处理。
Output
对每个测试用例在1行里输出最大和、最大连续子序列的第一个和最后一个元 素中间用空格分隔。如果最大连续子序列不唯一则输出序号i和j最小的那个如输入样例的第2、3组。若所有K个元素都是负数则定义其最大和为0输出整个序列的首尾元素。
Sample Input
6
-2 11 -4 13 -5 -2
10
-10 1 2 3 4 -5 -23 3 7 -21
6
5 -8 3 2 5 0
1
10
3
-1 -5 -2
3
-1 0 -2
0
问题分析遇到小于0的数就断开并记录起始位置判断是否大于原来的最大段的值大于则更新最大段
AC代码: #include iostream#include cstring#include algorithmusing namespace std;int a[10005];
int main(){int n,MAX,sum;while(cinnn){for(int i 0; in; i)scanf(%d,a[i]);int left,right,flag;MAX a[0];sum 0;left right a[0];for(i 0; in; i){if(sum0)//前一段总和小于0断开{sum a[i];flag a[i];}elsesuma[i];if(sumMAX)//更新最大值{MAX cnt;left flag;right a[i];}}if(MAX0){printf(0 %d %d\n,a[0],a[n-1]);continue;}printf(%d %d %d\n,MAX,left,right);}return 0;}