No.5018 Let's Make a Best-seller Book
タグ : / 解いたユーザー数 33
作問者 : e869120 / テスター : trineutron
問題文
日本には $N$ 個の書店があり,それぞれ $1$ から $N$ までの番号が付けられています。
また,各書店には 本の人気度 を表す値があり,最初はすべての書店で人気度が $0$ です。
さらに,各書店には 本の売れやすさ を表す値が決まっており,書店 $i$ の売れやすさは $D_i$ $(0.5 \leqq D_i < 1.5)$ ですが,最初は誰もこの値を知りません。
さて,ゆき出版はこの度『3 ヶ月でレッドコーダーになる方法』という本を出版しました。
出版社は本を売るため,各週の始まりに以下のいずれかの行動をとることができます。
ただし,出版社は最初 $200$ 万円を持っています。
-
1. 本を発送する
- 数列 $L = (L_1, L_2, \cdots, L_N)$ を決め,書店 $i$ に $L_i$ 冊の本を発送する。
- 費用は $1$ 冊につき $500$ 円,すなわち合計 $500(L_1 + L_2 + \cdots + L_N)$ 円かかる。
-
2. 広告を打つ
- $1$ 以上 $5$ 以下の整数 $x$ を決め,レベル $x$ の広告を打つ。
- すると,すべての書店で人気度が $x$ だけ上がる。
- 費用は $500000 \times 2^{x-1}$ 円かかる。
出版社が上記の行動を終えた直後における,書店 $i$ の人気度を $P_i$,残り在庫数を $R_i$ とするとき,書店 $i$ でこの週に売れる部数は以下の式で表されます。
ただし,$\text{rand}(0.75, 1.25)$ は $0.75$ 以上 $1.25$ 未満の一様分布にしたがう乱数とします。
$$
\lfloor \min(R_i, R_i^{0.5} \times 1.05^{P_i} \times D_i \times \text{rand}(0.75, 1.25)) \rfloor
$$
本が $1$ 冊売れると,週の終わりに出版社に $1000$ 円が入ってきます。
また,書店 $i$ での週の売り上げが $0.3R_i$ 冊以上である場合,週の終わりに,この書店における人気度が $1$ 増えます。
一方,書店 $i$ での週の売り上げが $0.1R_i$ 冊未満である場合,週の終わりに,この書店における人気度が $1$ 減ります。
ただし,週の始まりの時点 (出版社が行動を行った後) での在庫がゼロの場合は,人気度が変化しません。
$T$ 週間後までにできるだけ多くの部数を売るための,出版社の戦略を実装してください。
ただし,人気度は最大でも $+60$ までしか増えず,最小でも $-60$ までしか下がらないものとします。また,本の返品もないものとします。
なお,$1$ 週目が始まる前の時点では,すべての書店で在庫がゼロであることに注意してください。
制約
- $T=52$
- $N=10$
- $0.5 \leqq D_i < 1.5$ (入力では受け取らない隠された値であることに注意)
入出力
本問題はインタラクティブ問題です。通常の問題とは入出力形式が異なることに注意してください。
まず,最初に以下の形式で入力を受け取る必要があります。ただし,最初の所持金を $\text{Money}=2000000$ とします。
$T$ $N$ $\text{Money}$
次に,$T$ 回にわたって以下の (あ) と (い) をその順に繰り返します。
(あ) 出版社の行動を出力する。
もし書店 $i$ $(1 \leqq i \leqq N)$ に $L_i$ 冊の本を発送する場合,以下の形式で出力する。
ただし,週の始まりの時点での所持金を $\text{Money}$ とするとき,$0 \leqq L_i$ かつ $500(L_1 + L_2 + \cdots + L_N) \leqq \text{Money}$ を満たす必要がある。
$1$ $L_1$ $L_2$ $\cdots$ $L_N$
また,もしレベル $x$ の広告を打つ場合,以下の形式で出力する。
ただし,週の始まりの時点での所持金を $\text{Money}$ とするとき,$1 \leqq x \leqq 5$ かつ $500000 \times 2^{x-1} \leqq \text{Money}$ を満たす必要がある。
$2$ $x$
(い) 売上部数などのデータを受け取る。
週の終わりの時点での所持金を $\text{Money}$,書店 $i$ でこの週に売れた部数を $S_i$,週の終わりの時点での書店 $i$ における人気度を $P_i$,残り在庫数を $R_i$ とするとき,以下の形式で入力を受け取る。($S_i, P_i, R_i$ の値は,人気度の更新が終わった後の値であることに注意せよ)
$\text{Money}$ $S_1$ $S_2$ $\cdots$ $S_N$ $P_1$ $P_2$ $\cdots$ $P_N$ $R_1$ $R_2$ $\cdots$ $R_N$
重要な注意:1 回出力するごとに標準出力を flush してください。そうでない場合は TLE となる場合があります。
採点方法
本の売上部数を $\text{Result}$ とするとき,得点は $\lceil \text{Result}/100 \rceil$ 点となります。
ただし,出力が不正である場合は WA
と判定される。不正な出力とは以下を指します。
- 出力形式に従わなかった
- 資金が足りないような行動をしてしまった
- 書店に本を発注する場合で,$0 \leqq L_i$ を満たさない出力をしてしまった
- 広告を打つ場合で,$1 \leqq x \leqq 5$ を満たさない出力をしてしまった
もし途中で不正な出力をしてしまった場合,入出力の項の (い) において,一行で $-1$ という入力を受け取ることになるので,直ちにプログラムを終了してください。
もしプログラムを終了しなかった場合,採点結果は TLE
や RE
などの他のエラーになる可能性もあります。
テストケースは全部で $100$ 個あり,全テストケースの得点の合計が提出の得点となります。
コンテスト時間中に得た最高得点で最終順位が決定され,コンテスト終了後のシステムテストは行われません。
なお,テストケース数が $100$ であるため,合計得点はほぼ 売上部数の平均 となることに注意してください。
サンプルコード / ヒント
ヒューリスティック初心者は,この項目を読むことをお勧めします。
まず,インタラクティブ問題に慣れていない方のために,C++ と Python のサンプルコードを以下に示します。
このプログラムは,週の始めの時点での所持金を $\text{Money}$ とするとき,各書店に $\lfloor \text{Money}/(500N) \rfloor$ 冊を発送するという解法に基づいています。
また,この問題では入力として「残り在庫数」も与えられるため,必ずしも在庫数を手元で計算する必要はないことに注意してください。
テストケース生成方法 / 生成プログラム
この項目は問題の理解に必須ではないことに注意してください。
テストケースは以下のような方法で生成されます。
- 各 $i$ $(1 \leqq i \leqq N)$ に対して,$D_i$ の値は $0.5$ 以上 $1.5$ 未満の一様分布にしたがう乱数となる。
- また,各 $(t, i)$ $(1 \leqq t \leqq T, 1 \leqq i \leqq N)$ に対して,$0.75$ 以上 $1.25$ 未満の一様分布にしたがう乱数 $Z_{t, i}$ が決められており (この値はテストケースごとに異なる),$t$ 週目の書店 $i$ での $\text{rand}(0.75, 1.25)$ の値は $Z_{t, i}$ となる。なお,$\text{rand}(0.75, 1.25)$ については問題文の項を参照すること。
また,テストケース生成プログラムは こちら からダウンロードできます。
seed 値を入力してテストケースを出力するものとなっておりますので,ぜひコードテストなどを利用して使ってください。
サンプル1
このサンプルは制約と違って $T=2$ であることに注意してください。
プログラムからの入力 | プログラムの出力 |
---|---|
2 10 2000000 | |
1 30 30 30 30 30 30 30 30 30 30 | |
1903000 5 3 9 2 6 5 5 3 8 7 0 0 1 -1 0 0 0 0 0 0 25 27 21 28 24 25 25 27 22 23 |
|
2 2 | |
946000 5 3 6 3 7 3 4 3 6 3 2 2 3 1 2 2 2 2 2 2 20 24 15 25 17 22 21 24 16 20 |
本の売上部数は $96$ 部であるため,最終的なスコアは $\lceil 96/100 \rceil = 1$ 点となります。
なお,$1$ 週目の終わりには以下のことが起こっていることに注意してください。
- 書店 $3$ で在庫の $30\%$ 以上が売れたため,書店 $3$ の人気度が $1$ 増加した。
- 書店 $4$ で在庫の $10\%$ 未満しか売れなかったため,書店 $4$ の人気度が $1$ 減少した。
サンプル2
このサンプルは,間違った出力の例を示すサンプルであることに注意してください。
プログラムからの入力 | プログラムの出力 |
---|---|
2 10 2000000 | |
1 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 | |
-1 |
ユーザーが不正な出力をした場合,一行で -1
が受け取られることに注意してください。
なお,テストケース自体はサンプル 1 と同様です。
制約を満たすサンプル (100 個)
制約を満たすテストケースは,こちらから 100 個ダウンロードできます。(seed = 1 ~ 100)
入力が $T, N, D_i, Z_{t, i}$ の順になっており,$D_i$ や $Z_{t, i}$ は実際の入力では与えられないことに注意してください。
なお,$Z_{t, i}$ についてはテストケース生成方法の項を参照してください。
提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。