C语言解题——Max Sum

C语言解题

每天更新一道OJ题目,今日介绍如何求出数组中最大数的使用方法和示例。


前言

给定一个序列 a [1] ,a [2] ,a [3] ... ... a [ n ] ,您的工作是计算子序列的最大和。例如,给定(6,-1,5,4,-7) ,这个序列中的最大和是6 + (- 1) + 5 + 4 = 14。


一、输入

Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14.

输入的第一行包含一个整数T(1<=T<=20),这意味着测试用例的数量。然后T行,每一行以一个数字N(1<=N<=100000)开始,然后N个整数(所有整数都在-1000到1000之间)。

二、输出

The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line starts with a number N(1<=N<=100000), then N integers followed(all the integers are between -1000 and 1000).

对于每个测试用例,您应该输出两行。第一行是“Case #:”,#表示测试用例的编号。第二行包含三个整数,序列中的最大和、子序列的起始位置、子序列的结束位置。如果有多个结果,则输出第一个结果。在两个案例之间输出一个空行。

Sample Input 输入样本
 
  
2
5 6 -1 5 4 -7
7 0 6 -1 1 -6 7 -5
 
 
Sample Output 样本输出
 
  
Case 1:
14 1 4
Case 2:
7 1 6

思路:首先要找到连续区间和的最大值,并且要知道该区间的起点和终点。故当我们输入第一个数字时,让起点和终点都为这个位置,接下来判断下一个数字能否和该数字连续上,如果能连续上,则终点就向后挪移一位,如果不能连续上,就让下一个位置为新的起点和终点,以此类推,遍历完整个数组。


代码

1、

#include <stdio.h>

int main()
{
    int i,caseNum,testNum;
    int n,num,sum,max;
    int start,temPosition,end;   //定义初始位置与结束位置
    scanf("%d",&testNum);
    for(caseNum = 1;caseNum <= testNum;caseNum++)
    {
        max = -1001;
        sum = 0;
        temPosition = 1;
        scanf("%d",&n);
        for(i = 1 ;i<=n;i++)
        {
            scanf("%d",&num);
            sum = sum +num ;       //对其进行求和处理
            if(sum>max)      //判断SUM是否大于最小值值进行处理
            {
                max = sum;
                start = temPosition;
                end = i;
            }
            if(sum <0)     //当遇到sum为0时就可以判断出遇到了节点,此时需要重新定义开始位置
            {
                sum = 0;
                temPosition = i+1;
            }
        }
        printf("Case %d:\n%d ", caseNum, max );
        printf("%d %d\n", start, end);
        if (caseNum != testNum)
		{
			printf("\n");
		}
	}
	return 0;
}

2、

#include <stdio.h>
#include <stdlib.h>
 
void maxn( int T, int N, int *p );
int main( )
{
    int *p = NULL;
    int T, N, i;
    scanf("%d", &T);
    int j = 1, t = T;
    while ( t-- )
    {
        scanf("%d", &N );
        p = (int *)malloc(N*sizeof(int));   /*动态生成一个数组*/
        for( i =0 ; i < N; i++)
            scanf("%d",  p+i);
        maxn( j, N, p );
        if( j < T)           /*注意题目中所给要求,是两个实例中有一个空格*/
            printf("\n");
        j++;
    }
    return 0;
}
 
void maxn( int j, int N, int *p)    /*形参j是用来标注是第几个实例输出时Case j:*/
{
    int i, sum = 0, max = -1000;
    int sta, end, sta1 = 0;         /*定义初始位置与结束位置*/
    for( i = 0; i < N; i++)
    {
        sum += p[i];
        if( sum >= max )
        {
            max = sum;
            end = i;
            sta = sta1;
        }
        if( sum < 0 )           /*当遇到sum为0时就可以判断出遇到了节点,此时需要重新定义开始位置*/
        {
             sum = 0;
            sta1 = i+1;         /*sta1+1为下一个数的坐标*/
        }
    }
 
        printf("Case %d:\n%d ", j, max );
        printf("%d %d\n", sta+1, end+1);
}

以上就是今天的内容。

posted @ 2022-07-13 08:30  Xa_L  阅读(40)  评论(0编辑  收藏  举报  来源