結果
| 問題 |
No.662 スロットマシーン
|
| コンテスト | |
| ユーザー |
はむ吉🐹
|
| 提出日時 | 2018-03-09 23:19:17 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 59 ms / 2,000 ms |
| コード長 | 2,141 bytes |
| コンパイル時間 | 296 ms |
| コンパイル使用メモリ | 12,928 KB |
| 実行使用メモリ | 11,008 KB |
| 最終ジャッジ日時 | 2024-10-10 19:21:58 |
| 合計ジャッジ時間 | 2,169 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 19 |
ソースコード
#!/usr/bin/env python3
import functools
import operator
def product(iterable):
# 与えられた iterable の積を求める
return functools.reduce(operator.mul, iterable, 1)
def solve(symbols, symbol2score, symbol_lists):
# とりうるリールの止まり方の総数
total_num_poss = product(len(symbol_list) for symbol_list in symbol_lists)
# 絵柄 symbol_j と,それが各列に登場する回数 x_{j, i} を関連付ける辞書.
symbol2num_occs = dict()
for symbol in symbols:
symbol2num_occs[symbol] = [symbol_list.count(symbol)
for symbol_list in symbol_lists]
# 絵柄 symbol_j と,それがそろうパターン数 num_ptn_j を関連付ける辞書.
# 絵柄列 i に symbol_j が x_{j, i} 個あるなら,5 Π_i x_{j, i} が答え.
# ここで,5 は横(3 通り)と斜め(2 通り)の和
symbol2num_ptns = {symbol: 5 * product(symbol2num_occs[symbol]) for symbol
in symbols}
# 求める期待値は ex
ex = sum(symbol2num_ptns[symbol] * symbol2score[symbol]
for symbol in symbols) / total_num_poss
return ex, [symbol2num_ptns[symbol] for symbol in symbols]
def main():
# Notation が混乱しているので,自分で適当に定義する
# ついでに添え字を 0 始まりにしてしまう
# 絵柄の種類 symbols
# 絵柄 symbol_j と,それがそろったときの点数 score_j を関連付ける辞書.
symbols = []
symbol2score = dict()
for _ in range(5):
s, c0 = input().split()
symbols.append(s)
symbol2score[s] = int(c0)
# リールの絵柄列を格納する,文字のリストのリスト
symbol_lists = []
# 各列について行う
for _ in range(3):
# 絵柄列 i の長さ
n0 = int(input())
# 絵柄列 i を格納
symbol_lists.append([input() for _ in range(n0)])
# 解く
a, us = solve(symbols, symbol2score, symbol_lists)
print("{:.12f}".format(a))
print(*us, sep="\n")
if __name__ == '__main__':
main()
はむ吉🐹