結果
| 問題 |
No.108 トリプルカードコンプ
|
| コンテスト | |
| ユーザー |
uenoku
|
| 提出日時 | 2020-04-28 20:51:05 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,543 bytes |
| コンパイル時間 | 1,648 ms |
| コンパイル使用メモリ | 170,740 KB |
| 実行使用メモリ | 8,064 KB |
| 最終ジャッジ日時 | 2024-11-25 07:29:51 |
| 合計ジャッジ時間 | 2,349 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 17 WA * 3 |
ソースコード
#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]]++;
}
}
cout << calc(c[0], c[1], c[2]) << endl;
}
// -- 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;
}
uenoku