結果

問題 No.662 スロットマシーン
ユーザー はむ吉🐹
提出日時 2018-03-09 23:19:17
言語 Python3
(3.7.1 + numpy 1.14.5 + scipy 1.1.0)
結果
AC  
実行時間 45 ms
コード長 2,141 Byte
コンパイル時間 66 ms
使用メモリ 8,912 KB
最終ジャッジ日時 2019-07-09 03:33:36

テストケース

テストケース表示
入力 結果 実行時間
使用メモリ
input00.txt AC 22 ms
6,868 KB
input01.txt AC 23 ms
6,868 KB
input02.txt AC 24 ms
6,872 KB
input03.txt AC 24 ms
6,872 KB
input04.txt AC 26 ms
6,872 KB
input05.txt AC 24 ms
6,868 KB
input06.txt AC 27 ms
6,868 KB
input07.txt AC 27 ms
6,868 KB
input08.txt AC 38 ms
6,872 KB
input09.txt AC 45 ms
6,872 KB
input10.txt AC 45 ms
6,872 KB
input11.txt AC 45 ms
6,868 KB
input12.txt AC 44 ms
6,872 KB
input13.txt AC 44 ms
6,868 KB
input14.txt AC 45 ms
6,872 KB
input15.txt AC 45 ms
6,872 KB
input16.txt AC 23 ms
8,912 KB
input17.txt AC 44 ms
6,872 KB
input18.txt AC 44 ms
6,872 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