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. 股票买卖的主要内容,如果未能解决你的问题,请参考以下文章
菜鸟系列 Golang 实战 Leetcode —— 买卖股票的最佳时机系列(121. 买卖股票的最佳时机买卖股票的最佳时机 II