zoukankan      html  css  js  c++  java
  • 从群里抄来的某题

    题意:

    你一开始有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
    ", ans);
    19     /*while(!Q.empty()) {
    20         Q.pop();
    21     }
    22     main();*/
    23     return 0;
    24 }
    代码如下
  • 相关阅读:
    2.2 整数表示
    2.1 信息存储
    c++ string.erase()函数的使用
    classmethod修饰符
    27. 序列化
    26. 操作文件目录
    Java 内部类
    ConcurrentHashMap 源码解析 -- Java 容器
    Storm中的LocalState 代码解析
    Java中 return 和finally
  • 原文地址:https://www.cnblogs.com/huyufeifei/p/9552069.html
Copyright © 2011-2022 走看看