444 股票交易

D 股票交易

时间限制:1500ms   内存限制:65536kb

通过率:37/40 (92.50%)    正确率:37/63 (58.73%)

题目描述

一般一家公司的股票价格是不稳定的,就像图里所展示的这样,每时每刻的价格都在变。(图片来源网络)

现在,有一份很长很长的连续时间点股票价格数据(按时间从先到后顺序),老板需要你快速的寻找在这段数据范围内一次买卖股票的每股最大收益(假设所有人买卖股票都在给定时间点的数据范围内)。

要想解决这个问题,你该怎么办?

输入

多组测试数据(10组左右),以EOF结尾。

每组测试数据分为两行第一行为数组长度n,正整数,代表股票价格数据长度,数据范围为0<n<=1000000

第二行为n个正整数,为股票价格数据数组an,保证数组中每个数在int范围内。

输出

对于每次查询,输出一行,每行一个数,代表所求每股最大收益。

若无论如何都无法取得收益,则输出No solution

具体参见样例。

输入样例

5
1 2 3 4 2
2
2 2

输出样例

3
No solution

样例解释

关于第一组数据,假定第一分钟价格为1,第二分钟价格为2,第三分钟价格为3,第四分钟价格为4,第五分钟价格为2。这段时间内买入卖出的最大收益方案是在第一分钟以价格1买进、第四分钟以价格4卖出,收益为每股3个单位。


解析:

将前一天的股票减去后一天的股票得到一个新的数组b[],原题转化为求这个新数组的最大子数组。声明变量thisSum记录当前利润总和,maxSum记录最大利润总和,当thisSum为正时,从b[0]开始,thisSum不断累加,maxSum不断更新,直到thisSum为负,将其清零,如此循环即可求出最大利润maxSum。

代码:

#include<cstdio>

int a[1000007],b[1000007];
int maxSubNum(int a[],int n)
{
    int thisSum = 0,maxSum = 0;
    for(int i = 0;i < n;i++)
    {
        thisSum += a[i];
        if(thisSum > maxSum)
        {
            maxSum = thisSum;
        }
        else if(thisSum < 0)
        {
            thisSum = 0;
        }
    }
    return maxSum;
}

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        for(int i = 0;i < n;i++)
        {
            scanf("%d",&a[i]);
        }
        for(int i = 0;i < n-1;i++)
        {
            b[i] = a[i+1] - a[i];
        }
        int h = maxSubNum(b,n-1);
        if(h > 0)
        {
            printf("%d\n",h);
        }
        else
        {
            printf("No solution\n");
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值