PAT、PTA 最大子序列类经典问题 7-1 公司利润(20 分)两种方法解答

7-1 公司利润(20 分)

奶牛们开了家新公司,这家公司已经运作了N天,财务报表显示第i天获得的利润为Pi,有些天的利润可能是个负数。Farmer John想给奶牛公司写个新闻报道,以吹嘘她们的业绩。于是他想知道,这家公司在哪一段连续的日子里,利润总和是最大的。

输入格式:

第一行:单个整数N,1≤N≤10^5 第二行到N+1行:每行一个整数 Pi,代表第i天的利润,−1000≤Pi≤1000

输出格式:

一行,单个整数,表示在某段连续的日子里,最大的利润之和。

输入样例:

7
-3 4 9 -2 -5 8 -3

输出样例:

14

数据规模:

  • 对20%的数据,1<=N<=10
  • 对60%的数据,1<=N<=5000
  • 对100%的数据,1≤N≤10^5,−1000≤Pi≤1000

方法一:用三重循环硬解

#include<stdio.h>
int main()
{
	int i,j,n,k;
	scanf("%d",&n);
	int a[n];
	int max=-1,sum,S=-1;
	for(i=0;i<n;i++)
	scanf("%d",&a[i]);//为数组赋初值
	 
	for(i=0;i<n;i++)//连续天数的开始点 
	{
	
		for(j=1;j<=n-i;j++)//可能的连续天数情况 
		{
				sum=0;//每次循环开始时总和归零 
				for(k=i;k<j;k++)//从开始点开始循环 
				{
					sum+=a[k];
					
				}
				if(sum>S)
				{
					S=sum;
				}
		}
	}
	printf("%d",S);//输出最大的利润 
}

这道题我去年最开始做的时候没有什么思路,头脑里有三重循环的概念,但是没有敢往下写,思路还是不清晰,我发现在编程的过程中,一边编写代码一边在代码的结尾加上自己的注释,这样就不会在写下几行的时候忘了之前写的是什么意思了,加注释的效果非常好!

方法二:借用另一个存储前n天利润的数组

#include<stdio.h>
int main()
{
	int i,j,n,k;
		scanf("%d",&n);
	int a[n],b[n];//bn存放从第一天起连续不同天数的总利润 
	int sum,S,M=-999,N=999;//M,N分别表示bn中的最大值和最小值 
	for(i=0;i<n;i++)
	scanf("%d",&a[i]);//为数组赋初值
	
	for(i=1;i<=n;i++)//计算出bn的结果,其实类似于物理中的打点法求速度 
	{
		sum=0;
		for(j=0;j<i;j++)
		{
			sum+=a[j];
		}
		b[i-1]=sum;
	} 
	
	for(i=0;i<n;i++)//一次循环找出最大值和最小值
	{
		if(b[i]>M)
		M=b[i];
		
		if(b[i]<N)
		N=b[i];
	}
	S=M-N;
	printf("%d",S);
	 
	
	
}
由于该题目已过期,又没有在其他平台上找到该题目,故无法进行评测,但是自我感觉接近满分,可能数据量大的时候还要加以优化。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值