47 最大值

问题描述 :

为了培养明明对数学的热爱,明明的爸爸经常想出一些简单有趣且富有数学思想的游戏给明明玩。有一次,明明的爸爸在纸上写了N个数字,有正整数、负整数和0。明明的爸爸给明明一个范围,他可以选大于等于L1个且小于等于L2个的数字(L1≤L2),且这些数字必须是连续的。但是要求明明选出的数的和最大,这样说明明可能不太明白,于是明明爸爸就举了一个简单的例子。 例如有5个数字为“1”、“2”、“3”、“4”、“5”,明明可以选择大于等于1个且小于等于2个的数字,也就是说明明可以选择1个数字,或者连续的2个数字。通过观察数字串,最后我们会选2个数字,4和5,他们的和最大,为9。 明明明白爸爸的意思后,就开始玩起游戏来。但是他发现,这个游戏看似简单,其实还是有相当的难度,因为数字越多,选择数字个数范围越大,则题目越难,到后面明明有些不想玩了。于是明明就求助于你,请你帮他写一个程序,来求出和的最大值。 明明的问题可以归结为:有N个数字,从中选择出连续的M(L1≤M≤L2)个数,求出它们之和的最大值。

输入说明 :

你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据有两行,每组测试数据的第一行有三个整数N(0<N≤20)、L1、L2(0<L1≤L2≤N),N表示数字串中有多少个整数,L1、L2表示可选数字个数的范围,每组测试数据的第二行有N个整数,整数大小的绝对值都小于等于100,整数之间用一个空格隔开。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。

输出说明 :

对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将每组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个整数,即所求的最大值。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。 注:通常,显示屏为标准输出设备。

输入范例 :

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

输出范例 :

3
-1

 

思想:暴力方法按最小个数到最大个数遍历数组计算最值即可。应该还可以用动归优化一下。

 

#include <stdio.h>

int main()
{
    int a = 0, b = 0, c = 0;
    int nums[20]={0};
    int i = 0, j = 0, k = 0;
    int sum = 0, maxSum = 0; 
    while (scanf("%d%d%d", &a, &b, &c) != EOF){
        for (i = 0; i < a; i++){
            scanf("%d", &nums[i]);
        }
        maxSum = -9999;
        for (k = b; k <= c; k++){
            for (i = 0; i + k - 1 <= a - 1; i++){ // 连续选k个数的最大值
                sum = 0;
                for (j = i; j < i + k; j++){
                    sum += nums[j];
                }
                if (maxSum < sum){
                    maxSum = sum;
                }
            }
        }
        printf("%d\n", maxSum);
    }
    return 0;
}

 

posted @ 2022-03-02 09:33  梦想是能睡八小时的猪  阅读(28)  评论(0)    收藏  举报