• 7.19 股票问题


      今天是我在图灵当助教老师上班的第一天,今天和孩子们一起参加了入门考试,自己尽管做对了,但用的时间太多,心态慌,遇题不够冷静,不能静下心来认真思索,究其原因还是临场经验不足,考试竞赛太少,在以后的日子里还需要多加学习,多加锻炼,多参加比赛,积累经验。

    题目描述

    这些日子乔治一直在研究股票,经过调研,他终于发现了某公司股票的规 律。更可喜的是,乔治能推算出这家公司每天的股价,为了防止别人发现他的 秘密,他决定对于这家公司的股票最多买入、卖出各一次。现在他已经将股票 价格列了出来,根据股票价格表,你能算出乔治的每股股票最多能赚多少钱吗?

    输入

    输入的第一行,一个正整数 n,表示天数; (n<=1e5)

    第二行,用空格隔开的 n 个正整数,依次表示 n 天中每股股票的价格。

    输出

    输出只有一行,一个整数,表示每股最多赚多少钱。

    样例输入

    4
    947  267  359  771
    

    样例输出

    504



    题解代码:
    #include<iostream>
    #include<string>
    using namespace std;
    int n,a[1000005],dp[1000005],maxx=0;
    int main(){
     scanf("%d",&n);
     for(int i=1;i<=n;i++){
      scanf("%d",&a[i]);
     }
     dp[n]=a[n];
     for(int i=n-1;i>=1;i--){
      if(a[i]>dp[i+1]){
       dp[i]=a[i];
      }
      else dp[i]=dp[i+1];
     }
     
     for(int i=1;i<n;i++){
      if(a[i]<dp[i+1]){
       maxx=max(maxx,dp[i+1]-a[i]);
      }
      
     }
     printf("%d",maxx);
     return 0;
    }

    题解思路:
      首先,这道题要求算的是买入卖出的最大利润,可以想到,卖出一定是在买入之后,而且我们的最少盈利是0元(即当天买入,当天卖出的情况)
    我们要求的便是在第i天之后的i+1到n-1天的最大值,且必须比第i天的值大。

      具体做法是从0到n-1枚举每一个值并找到在第i个值i+1到n-1中最大的值且必须比a[i]大,若采用二重循环i从0到n-1,j从i+1到n-1得 枚举每一个元素从而找出每一个值后面最大的一个比该值大的值,时间复杂度为O(n^2),而此题n的值最大为100w,时间复杂度太高。
      而如果我们换一个思路,第一步先建立一个dp数组,dp[i]的值表示i之后,即i+1到n-1最大的值;
    第二步,for循环从0到n-1枚举每一个元素,求dp[i]-a[i](dp[i]必须大于a[i],若小于或等于,则直接continue跳入下一循环),
    求出n次循环差的最大值即为答案,将时间复杂度从O(n^2)降到了O(2n)。
      做题的时候性子不能急,耐心思考,细心钻研,才能得到准确优化,找到正确答案
  • 相关阅读:
    使用SQLCOMMAND以及SQLADAPERT 调用存储过程
    将表A的数据复制到表B,以及关于主表和子表的删除办法
    登录次数验证,可能还是有些不足的,希望大家指正
    MVC过滤器
    sql数据库delete删除后怎么恢复,这是网上找的答案。。希望大神验证指教一下
    淘宝前后端分离实践
    P1852 [国家集训队]跳跳棋
    P2154 [SDOI2009]虔诚的墓主人
    P4208 [JSOI2008]最小生成树计数
    P2467 [SDOI2010]地精部落
  • 原文地址:https://www.cnblogs.com/cxs070998/p/11215256.html
Copyright © 2020-2023  润新知