Chinaunix首页 | 论坛 | 博客
  • 博客访问: 584647
  • 博文数量: 104
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1559
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-21 00:58
个人简介

锻炼精神,首先要锻炼肉体

文章分类

全部博文(104)

文章存档

2018年(1)

2016年(1)

2015年(101)

2014年(1)

我的朋友

分类: C/C++

2015-03-02 11:28:58

题目链接:





点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int maxSubSum ( int *arr , int len ,int *from , int *to )
  3. {
  4.     int currentSum , maxSum ;
  5.     int begin , end ;

  6.     currentSum = 0;
  7.       maxSum = -1;
  8.   
  9.     begin = end = 0 ;

  10.     *from = *to = 0 ;

  11.     for ( int i = 0 ;i < len ; i++ )
  12.     {
  13.         currentSum += arr[i] ;
  14.         end = i ;

  15.         if ( currentSum > maxSum )
  16.         {
  17.             maxSum = currentSum ;
  18.             *from = begin ;
  19.             *to = end ;
  20.         }
  21.         if ( currentSum < 0 )
  22.         {
  23.             currentSum = 0 ;
  24.             begin = i+1 ;
  25.         }
  26.     }
  27.     return maxSum ;
  28. }

  29. int main ( void )
  30. {
  31.     int K , arr[100000] ;
  32.     int from , to ,max ;

  33.     scanf ( "%d" , &K ) ;

  34.     for ( int i = 0 ; i < K ; i++ )
  35.     {
  36.         scanf ("%d" , &arr[i]) ;
  37.     }


  38.     max = maxSubSum ( arr , K-1 , &from , &to ) ;

  39.     if ( max >= 0 )
  40.      printf ("%d %d %d" , max , arr[from] , arr[to] ) ;
  41.   
  42.     else
  43.      printf ("0 %d %d" , arr[0] , arr[K-1]) ;

  44.       return 0 ;
  45. }
一个 4 分的测试点没有通过


将上面代码中的 48 行 的 K -1 修改成为 K值之后,通过所有的测试点,大体思想不变

题目中有一点要求是需要格外注意的,那边是:
1. 数列中全部数均为负数 , 输出 max = 0 , 和原数列中的首尾元素值
2. 数列中存在 1 到多个 数值为0 的元素,其余元素均为负数,输出 max = 0 ,和首个 0 元素出现的序列

这两种情况必须加以区分,所以在对 max 进行初始化的时候,不能将其设定为 0 
应该将其设定为 -1 才可以

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int maxSubSum ( int *arr , int len ,int *from , int *to )
  4. {
  5.     int currentSum , maxSum ;
  6.     int begin , end ;

  7.     currentSum = 0 ;
  8.     maxSum = -1 ;
  9.     
  10.     begin = end = 0 ;

  11.     *from = *to = 0 ;

  12.     for ( int i = 0 ;i < len ; i++ )
  13.     {
  14.         currentSum += arr[i] ;
  15.         end = i ;

  16.         if ( currentSum > maxSum )
  17.         {
  18.             maxSum = currentSum ;
  19.             *from = begin ;
  20.             *to = end ;
  21.         }
  22.         if ( currentSum < 0 )
  23.         {
  24.             currentSum = 0 ;
  25.             begin = i+1 ;
  26.         }
  27.     }
  28.     return maxSum ;
  29. }

  30. int main ( void )
  31. {
  32.     int K , arr[100000] ;
  33.     int from , to ,max ;

  34.     scanf ( "%d" , &K ) ;

  35.     for ( int i = 0 ; i < K ; i++ )
  36.     {
  37.         scanf ("%d" , &arr[i]) ;
  38.     }
  39.     max = maxSubSum ( arr , K , &from , &to ) ;

  40.       if ( max >= 0 )
  41.         printf ("%d %d %d" , max , arr[from] , arr[to] ) ;
  42.   
  43.         else
  44.         printf ("0 %d %d" , arr[0] , arr[K-1] ) ;
  45.     
  46.     return 0 ;
  47. }

阅读(735) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~