1134_【改错题】最大连续子段和

2022-5-16 18:16| 发布者: Hocassian| 查看: 76| 评论: 0|原作者: 肇庆学院ACM合集

摘要:
C:\Users\Administrator\Downloads\2019-10-12-10-14-2-89503633543600-Problem List-采集的数据-后羿采集器.html

Pro.ID

1134

Title

【改错题】 最大连续子段和

Title链接

http://10.20.2.8/oj/exercise/problem?problem_id=1134

AC

390

Submit

1386

Ratio

28.14%

时间&空间限制

  • Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/32768 K (Java/Others)
  • 描述

    给出一个有N个整数的序列,求连续k个数的和的最大值。

    给出一份代码如下,请改正其中的6个错误,使之能在本系统上提交并AC。

    /*
     本代码没用复杂的方法,而是采用简单易懂的枚举法,求出每个“子段和”,保留最大的子段和,作为结果
    */
    #include <stdio.H>
    int a[100];
    int main()
    {
       int n, k;
       // 读入并处理每一个测试用例
       while( scanf( "%d%d", &n, &k) != EOF )
       {
           // 如果读到最后一个标志表示结束的测试用例,则结束循环
           if( n=0 && k=0 )
               break;
           // 定义一个变量,表示每一个“子段和”
           int tmp;
           // 把一个测试用例读入数组a中
           for( i=0; i<n; i++ )
               scanf( "%d", a[i] );
           // 假设最大子段和是一个很小初值
           int max_sum = -10000000;
           // 求出每个子段和,如果有更大一点的,更新之
           for( i=0; i<n-k+1; i++ )
           {
               // 求出当前一个子段和
               for( j=i; j<i+k; j++ )
                   tmp += a[j];
               // 如果当前子段和大于历史最大字段和,则更新最大子段和
               if( tmp > max_sum )
               max_sum = tmp;
           }
           // 输出这个测试用例的答案
           printf( "%d\n", max_sum );
       }
       return 0;
    }

    输入

    多测试用例。每个测试用例的第一行是两个正整数N和K (1 ≤ N ≤100,000, 1 ≤ K ≤ N )。

    接下来是一行,N个整数Pi (-10,000 ≤ Pi ≤ 10,000),表示该序列的第i个整数。

    最后一行N = K = 0,表示输入结束。

    输出

    Description

    给出一个有N个整数的序列,求连续k个数的和的最大值。

    给出一份代码如下,请改正其中的6个错误,使之能在本系统上提交并AC。

    /*
     本代码没用复杂的方法,而是采用简单易懂的枚举法,求出每个“子段和”,保留最大的子段和,作为结果
    */
    #include <stdio.H>
    int a[100];
    int main()
    {
       int n, k;
       // 读入并处理每一个测试用例
       while( scanf( "%d%d", &n, &k) != EOF )
       {
           // 如果读到最后一个标志表示结束的测试用例,则结束循环
           if( n=0 && k=0 )
               break;
           // 定义一个变量,表示每一个“子段和”
           int tmp;
           // 把一个测试用例读入数组a中
           for( i=0; i<n; i++ )
               scanf( "%d", a[i] );
           // 假设最大子段和是一个很小初值
           int max_sum = -10000000;
           // 求出每个子段和,如果有更大一点的,更新之
           for( i=0; i<n-k+1; i++ )
           {
               // 求出当前一个子段和
               for( j=i; j<i+k; j++ )
                   tmp += a[j];
               // 如果当前子段和大于历史最大字段和,则更新最大子段和
               if( tmp > max_sum )
               max_sum = tmp;
           }
           // 输出这个测试用例的答案
           printf( "%d\n", max_sum );
       }
       return 0;
    }

    Input

    多测试用例。每个测试用例的第一行是两个正整数N和K (1 ≤ N ≤100,000, 1 ≤ K ≤ N )。

    接下来是一行,N个整数Pi (-10,000 ≤ Pi ≤ 10,000),表示该序列的第i个整数。

    最后一行N = K = 0,表示输入结束。

    Output

    为每个测试用例单独输出一行结果:所给的序列的连续K个元素之和的最大值。

    Sample Input

    4 2
    1 -2 2 -4
    18 4
    1 -1 2 -1 3 -1 4 -1 5 -1 6 -1 7 -1 8 -1 9 -1
    0 0

    Sample Output

    0
    15

    Hint

    用例解释:

    第一个测试用例:该序列一共有4个元素,从左到右是:1,-2,2,-4。求连续2个元素之和的最大值。连续2个元素的情况分别有(1, -2),(-2, 2),(2, -4),它们之和分别是-1、0、-2,最大的是0。

    第二个测试用例:18个元素,连续4个元素构成一个子段,最大和的子段是(-1, 8, -1, 9) 或(8, -1, 9, -1),都是15。


    对于语法错误,一编译就能找到。对于语义错误,则要仔细看,还要平时程序编得多,积累了一定经验。再说,思路已说明,自己重写一个也行啊。

    改这题的错,花了很长时间?平时敲键盘的时间少,考试速度当然就慢。

    平时没有几百个小时的训练,能指望自己熟练操控挖掘机么?

    Source

    样例输入

    4 2
    1 -2 2 -4
    18 4
    1 -1 2 -1 3 -1 4 -1 5 -1 6 -1 7 -1 8 -1 9 -1
    0 0

    样例输出

    0
    15

    提示

    用例解释:

    第一个测试用例:该序列一共有4个元素,从左到右是:1,-2,2,-4。求连续2个元素之和的最大值。连续2个元素的情况分别有(1, -2),(-2, 2),(2, -4),它们之和分别是-1、0、-2,最大的是0。

    第二个测试用例:18个元素,连续4个元素构成一个子段,最大和的子段是(-1, 8, -1, 9) 或(8, -1, 9, -1),都是15。


    对于语法错误,一编译就能找到。对于语义错误,则要仔细看,还要平时程序编得多,积累了一定经验。再说,思路已说明,自己重写一个也行啊。

    改这题的错,花了很长时间?平时敲键盘的时间少,考试速度当然就慢。

    平时没有几百个小时的训练,能指望自己熟练操控挖掘机么?


    路过

    雷人

    握手

    鲜花

    鸡蛋

    最新评论

    返回顶部