はまやんはまやんはまやん

hamayanhamayan's blog

スロットマシーン [yukicoder No.662]

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]);
}