菜鸟练习PAT(七)

题目标号: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 ;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值