結果
問題 | No.108 トリプルカードコンプ |
ユーザー |
![]() |
提出日時 | 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);}// -- libvoid 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;}