結果
問題 | No.662 スロットマシーン |
ユーザー |
![]() |
提出日時 | 2018-03-09 23:19:17 |
言語 | Python3 (3.7.4 + numpy 1.14.5 + scipy 1.1.0) |
結果 |
AC
|
実行時間 | 47 ms |
コード長 | 2,141 Byte |
コンパイル時間 | 70 ms |
使用メモリ | 6,200 KB |
最終ジャッジ日時 | 2019-11-21 18:03:36 |
テストケース
テストケース表示入力 | 結果 | 実行時間 使用メモリ |
---|---|---|
input00.txt | AC | 23 ms
6,068 KB |
input01.txt | AC | 24 ms
6,068 KB |
input02.txt | AC | 24 ms
6,064 KB |
input03.txt | AC | 23 ms
6,072 KB |
input04.txt | AC | 26 ms
6,084 KB |
input05.txt | AC | 23 ms
6,072 KB |
input06.txt | AC | 28 ms
6,096 KB |
input07.txt | AC | 29 ms
6,096 KB |
input08.txt | AC | 37 ms
6,148 KB |
input09.txt | AC | 46 ms
6,200 KB |
input10.txt | AC | 46 ms
6,196 KB |
input11.txt | AC | 46 ms
6,196 KB |
input12.txt | AC | 46 ms
6,192 KB |
input13.txt | AC | 46 ms
6,196 KB |
input14.txt | AC | 46 ms
6,192 KB |
input15.txt | AC | 47 ms
6,200 KB |
input16.txt | AC | 23 ms
6,068 KB |
input17.txt | AC | 45 ms
6,192 KB |
input18.txt | AC | 46 ms
6,192 KB |
ソースコード
#!/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()