题目标号:A-1007
这道题目涉及到一个经典算法,求最大子串和,需要的童鞋请移步至最大子串和问题(Maximum Subarray)。题目在这个基础上规定了全为负数的一个输出,其中请注意一个测试点,就是只存在负数与零构成的字串(例:-1 0 0 -2)。
题目:
菜鸟代码:
#include "stdio.h"
#define MAXNUM 10001
int data[MAXNUM];
int main(void)
{
int count , i , tempi = 0 , tempj = 0 , start = 0 , end , sum =0 , max = 0 , flag = 0;
scanf("%d" , &count);
end = count - 1 ;
for( i =0 ; i < count ; i++)
{
scanf("%d" , &data[i]);
}
for( i =0 ; i < count ; i++)
{
sum = sum + data[i] ;
if(data[i] == 0)flag = 1 ;
if(sum > 0 || sum == 0)
{
tempj = i ;
if(sum > max)
{
max = sum ;
start = tempi ;
end = tempj ;
}
}
else
{
sum = 0;
tempi = i + 1;
}
}
if( (max == 0 ) && ( flag == 1) ) data[start] = data[end] = 0 ;
printf("%d %d %d\n" , max , data[start] , data[end]);
return 0 ;
}
======================================================================================================
#include <stdio.h>
#define MAX_NUM 10050
int main(void)
{
int N , data[MAX_NUM];
int i ;
int max = -1;
int first = 0 ;
int start = 0 , end = 0 ;
int i_start , i_end ;
freopen("input.txt" , "r" , stdin);
freopen("output.txt" , "w" , stdout);
while(scanf("%d" , &N)!=EOF)
{
int sum_last_all = 0;
for( i = 0 ; i< N ; i++)
{
scanf("%d" , &data[i]);
}
//外层结尾循环
for( i_end = 0 ; i_end < N ; i_end++)
{
int sum_tmp = 0;
//统计和
sum_last_all += data[i_end] ;
sum_tmp = sum_last_all ;
//将指针归零
i_start = 0 ;
//先比较此时的数据
if(sum_tmp > max || first==0)
{
first =1 ;
max = sum_tmp;
start = i_start;
end = i_end;
}
for(i_start = 0 ; i_start<i_end; i_start++)
{
sum_tmp = sum_tmp - data[i_start];
if(sum_tmp > max || first==0)
{
first =1 ;
max = sum_tmp;
start = i_start+1;
end = i_end;
}
}
}
if(max<0)
{
printf("%d %d %d\n" , 0 , data[0] , data[N-1]);
}
else
{
printf("%d %d %d\n" , max , data[start] , data[end]);
}
}
return 0 ;
}