从群里抄来的某题

博客围绕股票买卖盈利问题展开,已知某股票n天价格,每天可买1支、卖1支或不操作,目标是求n天后最大盈利。采用小根堆方法,将每天股价扔入堆两次,通过当天价格减堆顶得当天盈利,还涉及反悔、退流操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

你一开始有INF元,已知某股票n天的价格,你每天可以买1支股票,卖一支股票,不操作。问n天后你最多盈利多少。

解:

搞一个小根堆。

每天的股价都往里面扔两次,然后取当天价格 - 堆顶即为当天盈利。

堆中的数值意味着可能购买这个价的股票。

出堆意味着买 + 卖。

可以把不操作看成买1卖1,把买看成买2卖1,这样每天都要卖。

这样,①如果堆顶是今天,表明之前不可能买到更低价的股票,所以今天不卖。

入堆的那一次表明今天买的可能性。

②如果堆顶是之前某天,表明今天卖那一支。

入堆两次表明今天买的可能性与把卖的那支买回来的可能性(不卖)。

这样,等后者出堆时,实际上是把之前那一支拖到后面卖,而盈利分开计算,也就是所谓的反悔,退流操作。(费用分开计算?)

 1 #include <cstdio>
 2 #include <queue>
 3 
 4 std::priority_queue<double, std::vector<double>, std::greater<double> > Q;
 5 
 6 int main() {
 7     int n;
 8     double x, ans = 0.0;
 9     scanf("%d", &n);
10     for(int i = 1; i <= n; i++) {
11         scanf("%lf", &x);
12         Q.push(x);
13         Q.push(x);
14         ans += x - Q.top();
15         Q.pop();
16     }
17 
18     printf("%.0lf\n", ans);
19     /*while(!Q.empty()) {
20         Q.pop();
21     }
22     main();*/
23     return 0;
24 }
代码如下

 

转载于:https://www.cnblogs.com/huyufeifei/p/9552069.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值