版权声明:转载时 别忘了注明出处 https://blog.csdn.net/ZCY19990813/article/details/89292747
链接:https://ac.nowcoder.com/acm/contest/625/I
来源:牛客网
题目描述
攒机一时爽,一直攒机一直爽。
沉迷攒机的胡老师很快就发现,他每天只能靠吃泡面过活了。为了改善伙食,同时继续攒机大业,胡老师决定下海炒股。
胡老师有特别的炒股技巧。首先他会选定一支他看好的股票,然后永远只买这一支股票。此外,胡老师每天要么只买入股票要么只卖出股票,且出于某种不为人知的原因,胡老师手上最多只能持有 1 股的股票。胡老师每天会根据当天的股价及手上的持股数决定是买入还是卖出股票,需要注意的是,只要胡老师选择了买入或卖出,那么一定可以按当天的价格买入或卖出股票。
炒股需要本金,但胡老师的钱都拿去攒机了,于是他去找 CC 借了一大笔钱(这笔钱可以视为无穷多),并约定 n 天之后归还。另一方面,为最大化 n 天内的收益,胡老师通过不为人知的 py 交易获取了接下来 n 天每天的股票价格。
在一开始,胡老师手上没有持有股票。胡老师想知道,在n天之后他最多能靠炒股赚多少钱。
输入描述:
第一行是一个整数n (1≤n≤5×105)n (1≤n≤5×105),表示天数。
接下来 n 行给出了接下来 n 天内胡老师看好的股票每天的价格,其中第 i 行是一个整数 ai (1≤ai≤106)ai (1≤ai≤106),表示该股票在第 i 天的价格。
输出描述:
输出一行一个整数 ans,表示 n 天之后胡老师最多能赚的钱数。
Input:
5
1
3
2
6
4
output
6
思路:用一个数组来纪录股票价格的浮动,只有一种情况可以买入(手里没有股票并且接下来是上升的),只有一种情况卖出(手里有股票并且接下来是下降的),其他情况不买也不卖,用flag来标记手里现在有没有股票,初始为0,代表手里没有股票。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <sstream>
#include <cstdio>
#include <vector>
#include <string>
#include <cmath>
#include <stack>
#include <queue>
#include <map>
#include <set>
#define MAX 0x3f3f3f3f
#define fori(a,b) for(LL i=a;i<=b;i++)
#define forj(a,b) for(LL j=a;j<=b;j++)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const double PI = acos(-1);
const LL M=5e5+10;
LL a[M];
LL b[M];
int main()
{
LL t,flag=0;
cin >> t;
mem(b,0);
for(int i=1;i<=t;i++){
scanf("%lld",&a[i]);
if(a[i]>a[i-1]&&i>1){
b[i-1]=1; //b数组用来存股票价格的浮动
}
}
LL ans=0;
for(int i=1;i<=t;i++){
if(!flag&&b[i]){//如果手里没有股票并且接下来是上升的,买入
flag=1;
ans-=a[i];
}
if(b[i]==0&&flag) {//如果手里有股票并且接下来是下降的,卖出
flag=0;
ans+=a[i];
}
//其他情况不买也不卖
}
cout << ans <<endl;
return 0;
}