Newguy


私信TA

用户名:772007765

访问量:88820

签 名:

已秃人士

等  级
排  名 29
经  验 15371
参赛次数 3
文章发表 92
年  龄 0
在职情况 在职
学  校
专  业

  自我简介:

TA的其他文章

描述

给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个,例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和为20。现在增加一个要求,即还需要输出该子序列的第一个和最后一个元素。

输入

测试输入包含若干测试用例,每个测试用例占2行,第1行给出正整数K( K< =  10000 ),第2行给出K个整数,中间用空格分隔 ,每个数的绝对值不超过 100 。当K为0时,输入结束,该用例不被处理。 

输出

对每个测试用例,在1行里输出最大和、最大连续子序列的第一个和最后一个元素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样例的第2、3组)。若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。 

样例输入1

5
-3 9 -2 5 -4
3
-2 -3 -1
0

样例输出1

12 9 5
0 -2 -1

#include <stdio.h>         //dp   不断更新最大值
int main()               
{
	int n;
	while (scanf("%d",&n)&&n)
	{
		int i,count_=0;
		int num[10000];
		int sum=0,max=0;
		int begin,end,maxbegin;

		for (i=0;i<n;i++)
		{
			scanf("%d",&num[i]);
			if (num[i]<0)
				count_++;
		}
		maxbegin=begin=end=num[0];
		if (count_++==n)
			printf("0 %d %d\n",num[0],num[n-1]);
		else
		{
			for (i=0;i<n;i++)
			{
				sum+=num[i];
				if (sum>max)
				{
					maxbegin=begin;
					max=sum;
					end=num[i];
				}
				if (sum<0)       //如果前n个数的和为负就丢弃,从下一个数开始计算
				{
					sum=0;
					begin=num[i+1];
				}
			}
			printf("%d %d %d\n",max,maxbegin,end);
		}
	}
	return 0;
}


 

0.0分

0 人评分

  评论区

  • «
  • »