Задача
Ограничения: время – 2s/4s, память – 64MiB Ввод: input.txt или стандартный ввод Вывод: output.txt или стандартный вывод
Послать решение Blockly Посылки Темы Где Обсудить (0)
Frank is a portfolio manager of a closed-end fund for Advanced Commercial Markets (ACM). Fund
collects money (cash) from individual investors for a certain period of time and invests cash into various
securities in accordance with fund's investment strategy. At the end of the period all assets are sold out
and cash is distributed among individual investors of the fund proportionally to their share of original
investment.
Frank manages equity fund that invests money into stock market. His strategy is explained below.
Frank's fund has collected c US Dollars (USD) from individual investors to manage them for `m` days.
Management is performed on a day by day basis. Frank has selected `n` stocks to invest into. Depending
on the overall price range and availability of each stock, a lot size was chosen for each stock – the number
of shares of the stock Frank can buy or sell per day without affecting the market too much by his trades.
So, if the price of the stock is `p_i` USD per share and the lot size of the corresponding stock is `s_i`, then
Frank can spend `p_i\ s_i` USD to buy one lot of the corresponding stock for his fund if the fund has enough
cash left, thus decreasing available cash in the fund. This trade is completely performed in one day.
When price of the stock changes to `p'_i` later, then Frank can sell this lot for `p'_i\ s_i` USD, thus increasing
available cash for further trading. This trade is also completely performed in one day. All lots of stocks
that are held by the fund must be sold by the end of the fund's period, so that at the end (like at the
beginning) the fund is holding only cash.
Each stock has its own volatility and risks, so to minimize the overall risk of the fund, for each stock
there is the maximum number of lots `k_i` that can be held by the fund at any given day. There is also the
overall limit k on the number of lots of all stocks that the fund can hold at any given day.
Any trade to buy or sell one lot of stock completely occupies Frank's day, and thus he can perform at
most one such trade per day. Frank is not allowed to buy partial lots if there is not enough cash in the
fund for a whole lot at the time of purchase.
Now, when fund's period has ended, Frank wants to know what is the maximum profit he could have
made with this strategy having known the prices of each stock in advance. Your task is to write a program
to find it out.
It is assumed that there is a single price for each stock for each day that Frank could have bought or
sold shares of the stock at. Any overheads such as fees and commissions are ignored, and thus cash spent
to buy or gained on a sell of one lot of stock is exactly equal to its price on this day multiplied by the
number of shares in a lot.
Input
The first line of the input file contains four numbers – `c`, `m`, `n`, and `k`. Here `c` (`0.01\ ≤\ c\ ≤\ 100000000.00`)
is the amount of cash collected from individual investors up to a cent (up to two digits after decimal
point); `m` (`1\ ≤\ m\ ≤\ 100`) is the number of days in the fund's lifetime; `n` (`1\ ≤\ n\ ≤\ 8`) is the number of
stocks selected by Frank for trading; `k` (`1\ ≤\ k\ ≤\ 8`) is the overall limit on the number of lots the fund
can hold at any time.
The following `2n` lines describe stocks and their prices with two lines per stock.
The first line for each stock contains the stock name followed by two integer numbers `s_i` and `k_i`. Here `s_i`
(`1\ ≤\ s_i\ ≤\ 1000000`) is the lot size of the given stock, and `k_i` (`1\ ≤\ k_i\ ≤\ k`) is the number of lots of this
stock the fund can hold at any time. Stock name consists of 1 to 5 capital Latin letters from "A" to "Z".
All stock names in the input file are distinct.
The second line for each stock contains `m` decimal numbers separated by spaces that denote prices of
the corresponding stock for each day in the fund's lifetime. Stock prices are in range from 0.01 to 999.99
(inclusive) given up to a cent (up to two digits after decimal point).
Cash and prices in the input file are formatted as a string of decimal digits, optionally followed by a dot
with one or two digits after a dot.
Output
Write to the output file m+1 lines.
On the first line write a single decimal number – the precise value for the maximal amount of cash that
can be collected in the fund by the end of its period. The answer will not exceed 1000000000.00. Cash
must be formatted as a string of decimal digits, optionally followed by a dot with one or two digits after
a dot.
On the following `m` lines write the description of Frank's actions for each day that he should have made
in order to realize this profit. Write BUY followed by a space and a stock name for buying a stock. Write
SELL followed by a space and a stock name for selling a stock. Write HOLD if nothing should have been
done on that day.
Sample input
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
Sample output
151205.00
BUY GOOG
BUY IBM
BUY IBM
HOLD
SELL IBM
BUY MSFT
SELL MSFT
SELL GOOG
SELL IBM
Source: ACM ICPC NEERC 2007