https://yukicoder.me/problems/no/662
解法
https://yukicoder.me/submissions/243136
全ての場合を全探索すると間に合わない。
★2なので、なるべく簡単に考えてみよう。
全てのリールで絵柄の個数を数えておこう。
「A[i][j] := i番目のリールでj番目の絵柄が何個あるか」
二番目の答えから求めていこう。
全ての出目についてi番目の絵柄が何回でるかは、「(1番目のリールでの個数)×(2番目のリールでの個数)×(2番目のリールでの個数)×5」で求められる。
×5は上一列、中一列、下一列、右上がり対角線、左上がり対角線の5つの位置の組合せで、個数の総積は絵柄の組合せである。
一番目の答えは、「(全ての得点の総和)÷(出目の組み合わせ数)」である。
全ての得点の総和は二番目の答えがあれば、組み合わせ数×点数ですぐ求まる。
出目の組み合わせ数はリールの絵柄の個数の総積。
string str[5]; int coin[5]; int N[3]; map<string, int> A[3]; double ans1; ll ans2[5]; //--------------------------------------------------------------------------------------------------- void _main() { rep(i, 0, 5) cin >> str[i] >> coin[i]; rep(i, 0, 3) { cin >> N[i]; rep(j, 0, N[i]) { string s; cin >> s; A[i][s]++; } } rep(i, 0, 5) { string s = str[i]; ans2[i] = 5LL * A[0][s] * A[1][s] * A[2][s]; ans1 += ans2[i] * coin[i]; } rep(i, 0, 3) ans1 /= N[i]; printf("%.10f\n", ans1); rep(i, 0, 5) printf("%lld\n", ans2[i]); }