• 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)。
      做题的时候性子不能急,耐心思考,细心钻研,才能得到准确优化,找到正确答案
  • 相关阅读:
    Supermap/Cesium 开发心得----获取三维视角的四至范围
    Supermap/Cesium 开发心得----定位
    GIS面试小知识点
    Oracle数据库小知识点整理
    利用 uDig 生成 GeoServer 可用的 SLD 渲染文件
    Geoserver设置style
    图片按宽高比1:1响应,窗口大小如何变化,图片宽高始终相等
    简单树
    递归渲染树
    div等高布局
  • 原文地址:https://www.cnblogs.com/cxs070998/p/11215256.html
Copyright © 2020-2023  润新知