1.九度1011

来源:互联网 发布:rf手游网络错误 编辑:程序博客网 时间:2024/05/08 20:43
题目描述:
    给定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个整数,中间用空格分隔。当K为0时,输入结束,该用例不被处理。

输出:

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


样例输入:
6-2 11 -4 13 -5 -210-10 1 2 3 4 -5 -23 3 7 -2165 -8 3 2 5 01103-1 -5 -23-1 0 -20
样例输出:
20 11 1310 1 410 3 510 10 100 -1 -20 0 0
来源:
2005年浙江大学计算机及软件工程研究生机试真题


</pre><pre name="code" class="cpp">#include <stdio.h>using namespace std;int main(){    int k;    int num[10000];    int i;    int sum,max,start,end;    int tp1,tp2;    int zero = 0;    while(scanf("%d",&k)!=EOF)    {        if(k==0)            return 0;        for(i=0;i<k;i++)        {            scanf("%d",&num[i]);        }        sum=0;        max=-1;        start=0;        end=0;        tp1 = 0;        tp2 = 0;        for(i = 0;i < k;i++)        {            sum = sum + num[i];            tp2 = i;            if(sum > max)            {                max = sum;                end = tp2;                start = tp1;            }            else if(sum < 0)            {                tp1 = i+1;                sum = 0;            }        }        if(max < 0)        printf("%d %d %d\n",zero,num[0],num[k-1]);        else        printf("%d %d %d\n",max,num[start],num[end]);    }    return 0;}


0 0
原创粉丝点击