SDMU OJ#P19. 股票买卖

Posted 江上舟摇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SDMU OJ#P19. 股票买卖相关的知识,希望对你有一定的参考价值。

Description

七七是一个炒股的爱好者,整日痴迷与炒股,但是由于七七数学不好,需要你帮助他算出炒股获得的最大利润是多少。现在给定一个长度为 N 的数组,数组中的第 i 个数字表示一个给定股票在第 i 天的价格。如果最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算七七所能获取的最大利润。注意你不能在买入股票前卖出股票(如果不进行任何交易, 最大利润为 0)。由于七七是一个非常会股票买卖的的人,七七最终获得的利润是原来获得利润的100倍,如果七七最终获得的利润小于1e18,则输出获得的利润,否则输出“fa cai le!”。

Input

第一行包含整数 NNN,表示数组长度。第二行包含 NNN 个不大于 1e18 的正整数,表示完整的数组。(1<=N<=100000)

Output

如果七七最终获得的利润小于1e18,则输出获得的利润,否则输出“fa cai le!”。

Sample

Input 1

5
46 49 49 35 48

Output 1

1300

Input 2

2
1 1000000000000000000

Output 2

fa cai le!

Hint

时间限制:1000ms

内存限制:65536KiB

这个题无非就是求最大差,有两种思路:

1.贪心:

j>i,找出所有区间中最大的a[j]-a[i],最后按照题目要求输出,参考代码如下:

 #include<bits/stdc++.h>
 using namespace std;
 long long  a[100010];
 int n;
 long long ans; 
 int main()
 
     ios::sync_with_stdio(false);
     cin>>n;
     for(int i=1;i<=n;i++)
     cin>>a[i];
         for(register int i=1;i<=n;i++) 
         
             for(register int j=i+1;j<=n;j++)
             
                 ans=max(ans,a[j]-a[i]);
             
         
         if(ans*100<1e18)
         cout<<ans*100;
         else
         cout<<"fa cai le!";
     return 0;
 

下一种方法是dp,我们让dp【i】表示前i天最小的股票价值,就相当于找到了起点,

要求最大利润,即a[j]-a[i]最大并且i < j. 如果我们能知道前j个元素中的最小值,就可以找到买股票的起点。因此令dp[i]表示前i个元素中的最小值,可以得到这样的状态转移方程:
dp[1] = a[1],dp[i] = min(a[i], dp[i-1]).
那么a[i] - dp[i]就代表着前i个元素中的最大利润。我们枚举i,找到最大的i使得a[i]-dp[i]最大即可。

参考代码如下:

 #include<bits/stdc++.h>
 using namespace std;
 long long dp[100010];//前i个元素中最小值 
 long long a[100010];
 int n;
 long long ans;
 int main()
 
     ios::sync_with_stdio(false);
     cin>>n;
     for(int i=1;i<=n;i++)
     cin>>a[i];
     dp[1]=a[1];//初始化 
     for(int i=2;i<=n;i++)
     
         dp[i]=min(dp[i-1],a[i]);//转移方程 
         ans=max(ans,a[i]-dp[i]);//当前ans的值和当前股票的价值与最小股票值之差谁大,开始枚举 
     
     if(ans*100<1e18)
     cout<<ans*100;
     else
     cout<<"fa cai le!";
     return 0;
 

 

戒骄戒躁,任重道远

以上是关于SDMU OJ#P19. 股票买卖的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 122: 买卖股票的最佳时机 II

百练4121 股票买卖

(转)动态规划算法—买卖股票的最佳时机系列

LeetCode ---- 买卖股票系列问题思路与题解

LeetCode ---- 买卖股票系列问题思路与题解

菜鸟系列 Golang 实战 Leetcode —— 买卖股票的最佳时机系列(121. 买卖股票的最佳时机买卖股票的最佳时机 II