从群里抄来的某题
题意:
你一开始有INF元,已知某股票n天的价格,你每天可以买1支股票,卖一支股票,不操作。问n天后你最多盈利多少。
解:
搞一个小根堆。
每天的股价都往里面扔两次,然后取当天价格 - 堆顶即为当天盈利。
堆中的数值意味着可能购买这个价的股票。
出堆意味着买 + 卖。
可以把不操作看成买1卖1,把买看成买2卖1,这样每天都要卖。
这样,①如果堆顶是今天,表明之前不可能买到更低价的股票,所以今天不卖。
入堆的那一次表明今天买的可能性。
②如果堆顶是之前某天,表明今天卖那一支。
入堆两次表明今天买的可能性与把卖的那支买回来的可能性(不卖)。
这样,等后者出堆时,实际上是把之前那一支拖到后面卖,而盈利分开计算,也就是所谓的反悔,退流操作。(费用分开计算?)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }