从群里抄来的某题

题意:

你一开始有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 }
代码如下

猜你喜欢

转载自www.cnblogs.com/huyufeifei/p/9552069.html