結果

問題 No.662 スロットマシーン
ユーザー はむ吉🐹はむ吉🐹
提出日時 2018-03-09 23:19:17
言語 Python3
(3.8.3 + numpy 1.14.5 + scipy 1.1.0)
結果
AC  
実行時間 44 ms / 2,000 ms
コード長 2,141 Byte
コンパイル時間 61 ms
使用メモリ 8,744 KB
最終ジャッジ日時 2020-08-15 18:45:03
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
使用メモリ
testcase_00 AC 21 ms
8,356 KB
testcase_01 AC 22 ms
8,480 KB
testcase_02 AC 21 ms
8,364 KB
testcase_03 AC 22 ms
8,604 KB
testcase_04 AC 22 ms
8,624 KB
testcase_05 AC 19 ms
8,544 KB
testcase_06 AC 24 ms
8,564 KB
testcase_07 AC 24 ms
8,468 KB
testcase_08 AC 34 ms
8,444 KB
testcase_09 AC 43 ms
8,744 KB
testcase_10 AC 43 ms
8,528 KB
testcase_11 AC 43 ms
8,608 KB
testcase_12 AC 43 ms
8,744 KB
testcase_13 AC 44 ms
8,744 KB
testcase_14 AC 44 ms
8,668 KB
testcase_15 AC 43 ms
8,736 KB
testcase_16 AC 20 ms
8,392 KB
testcase_17 AC 43 ms
8,608 KB
testcase_18 AC 44 ms
8,536 KB
権限があれば一括ダウンロードができます

ソースコード

diff #
#!/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()
0