結果
問題 | No.108 トリプルカードコンプ |
ユーザー | uenoku |
提出日時 | 2020-04-28 20:54:55 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 9 ms / 5,000 ms |
コード長 | 1,640 bytes |
コンパイル時間 | 1,416 ms |
コンパイル使用メモリ | 170,676 KB |
実行使用メモリ | 12,484 KB |
最終ジャッジ日時 | 2024-11-25 07:33:31 |
合計ジャッジ時間 | 2,305 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 20 |
ソースコード
#include <bits/stdc++.h> #define rep(i, n) for (lli i = 0; i < (n); i++) #define rrep(i, n) for (lli i = (n)-1; i >= 0; i--) using namespace std; using lli = long long int; void YESNO(bool), YesNo(bool); template <class T1, class T2> bool chmin(T1 &l, const T2 &r); template <class T1, class T2> bool chmax(T1 &l, const T2 &r); double dp[105][105][105] = {}; int n; double calc(int zero, int one, int two) { double &ret = dp[zero][one][two]; if (ret > 0) return ret; if (zero == 0 && one == 0 && two == 0) return 0; ret = 1; double p0 = double(zero) / double(n); double p1 = double(one) / double(n); double p2 = double(two) / double(n); double p3 = double(n - zero - one - two) / double(n); if (zero) ret += calc(zero - 1, one + 1, two) * p0; if (one) ret += calc(zero, one - 1, two + 1) * p1; if (two) ret += calc(zero, one, two - 1) * p2; ret /= (1 - p3); return ret; } int main() { cin >> n; vector<int> a(n); vector<int> c(3); rep(i, n) { cin >> a[i]; if (a[i] < 3) { c[a[i]]++; } } rep(i, n) rep(j, n) rep(k, n) { dp[i][j][k] = -1; } double ret = calc(c[0], c[1], c[2]); printf("%.10f\n", ret); } // -- lib void YESNO(bool b) { cout << (b ? "YES" : "NO") << endl; } void YesNo(bool b) { cout << (b ? "Yes" : "No") << endl; } template <class T1, class T2> bool chmin(T1 &l, const T2 &r) { return (l > r) ? (l = r, true) : false; } template <class T1, class T2> bool chmax(T1 &l, const T2 &r) { return (l < r) ? (l = r, true) : false; }