#P3570. Fund Management

Fund Management

题目描述

Frank 是 高级商业市场(ACM) 旗下封闭式基金的投资组合经理。基金从个人投资者处募集一定数额的现金(cash),并在基金的投资期限内进行管理。基金按照其投资策略将这些现金投资于各种证券。在期末,所有资产被售出,现金将根据投资者原始投资份额的比例进行分配。

Frank 管理的是一个股票基金,资金投资于股票市场。他的策略如下所述。

Frank 的基金从投资者处募集了 cc 美元(USD)现金,计划管理 mm 天。投资管理是逐日进行的。Frank 选择了 nn 支股票进行投资。根据每支股票的整体价格范围和可交易性,为每支股票设定了一个批处理规模(lot size)sis_i—— 即 Frank 每天在不大幅影响市场的前提下可以买卖的该股票股数。因此,如果股票价格为 pip_i 美元/股,其批处理规模为 sis_i,那么当基金有足够剩余现金时,Frank 可以花费 pi×sip_i \times s_i 美元为基金购买一批该股票,这将减少基金的可支配现金。此项交易在一天内完成

当股票价格在后期变为 pip'_i 时,Frank 可以以 pi×sip'_i \times s_i 美元的价格出售这批股票,从而增加可用于进一步交易的现金。此项交易也在一天内完成。基金持有的所有股票批次必须在基金期限结束时售出(因此在结束时,基金将只持有现金)。

每支股票有其自身的波动性和风险。为最小化基金的整体风险,对每支股票 ii 设定有最大持有批次数上限 kik_i —— 即基金在任何一天可以持有的该股票的最大批次数。同时还有一个整体批次持有上限 kk —— 即基金在任何一天持有的所有股票批次总数。

任何买卖一批股票的交易都会占用 Frank 一整天的时间,因此他每天最多只能进行一次这样的交易操作。在购买时,如果基金现金不足以购买整批股票,Frank 不允许购买部分批次(Frank is not allowed to buy partial lots)。

现在,当基金期限结束时,Frank 预先已知晓每支股票每日的价格。他想知道在基金期限内,他运用此策略所能实现的最大利润是多少。您的任务是编写程序来找出这个最大利润。

假设每天每支股票只有一个交易价格,Frank 可在此价格买卖该股票。忽略任何手续费或佣金等间接成本,因此购买或出售一批股票所花费或获得的现金完全等于当日的股票价格乘以批处理规模(股数)。


输入格式

输入文件的第一行包含四个数字:ccmmnnkk

  • cc (0.01 ≤ cc ≤ 100 000 000.00):从投资者处募集的现金金额(美元),精确到美分(小数点后最多两位)。
  • mm (1 ≤ mm ≤ 100):基金的存续天数。
  • nn (1 ≤ nn ≤ 8):Frank 选择交易的股票数量。
  • kk (1 ≤ kk ≤ 8):基金在任何时间点可以持有的所有股票的批次总数的整体上限

接下来的 2n2n 行用于描述股票及其价格,每支股票占两行。

  • 每支股票的第一行包含股票名称,后跟两个整数 sis_ikik_i
    • sis_i (1 ≤ sis_i ≤ 1 000 000):该股票的批处理规模(股数/批)。
    • kik_i (1 ≤ kik_ikk):该股票在任何时间点基金可以持有的最大批次数上限
    • 股票名称由 1 到 5 个大写拉丁字母(“A”到“Z”)组成。输入文件中的所有股票名称都是唯一的。
  • 每支股票的第二行包含 mm 个由空格分隔的十进制数,表示该股票在基金存续期内的每日价格(美元)。股票价格在 0.01 到 999.99(包含)之间,精确到美分(小数点后最多两位)。
  • 输入文件中的现金金额 cc 和股票价格格式均为十进制数字字符串,可选地后跟一个小数点和一或两位小数。

输出格式

向输出文件写入 m+1m + 1 行。

  • 第一行写入一个十进制数字:基金期限结束时可以累计获得的现金的最大总额(美元)。该金额精确到美分(小数点后最多两位)。答案不会超过 1 000 000 000.00。
  • 接下来的 mm 行描述 Frank 为达到此最大利润在每一天应该执行的操作
    • 若为买入操作,写入 BUY + 空格 + 股票名称(例如 BUY GOOG)。
    • 若为卖出操作,写入 SELL + 空格 + 股票名称(例如 SELL IBM)。
    • 若当日无需操作,写入 HOLD

样例输入 1

144624.00 9 5 3
IBM 500 3
97.27 98.31 97.42 98.9 100.07 98.89 98.65 99.34 100.82
GOOG 100 1
467.59 483.26 487.19 483.58 485.5 489.46 499.72 505 504.28
JAVA 1000 2
5.54 5.69 5.6 5.65 5.73 6 6.14 6.06 6.06
MSFT 250 1
29.86 29.81 29.64 29.93 29.96 29.66 30.7 31.21 31.16
ORCL 300 3
17.51 17.68 17.64 17.86 17.82 17.77 17.39 17.5 17.3

样例输出 1

151205.00
BUY GOOG
BUY IBM
BUY IBM
HOLD
SELL IBM
BUY MSFT
SELL MSFT
SELL GOOG
SELL IBM

来源

Northeastern Europe 2007