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);
}
由于该题目已过期,又没有在其他平台上找到该题目,故无法进行评测,但是自我感觉接近满分,可能数据量大的时候还要加以优化。