結果
| 問題 | No.108 トリプルカードコンプ |
| コンテスト | |
| ユーザー |
mayoko_
|
| 提出日時 | 2014-12-23 00:40:34 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 9 ms / 5,000 ms |
| コード長 | 1,336 bytes |
| コンパイル時間 | 620 ms |
| コンパイル使用メモリ | 73,708 KB |
| 実行使用メモリ | 12,928 KB |
| 最終ジャッジ日時 | 2024-06-12 03:49:03 |
| 合計ジャッジ時間 | 1,402 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 20 |
ソースコード
#include <sstream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <iostream>
#include <utility>
#include <set>
#include <cctype>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define INF 1000000000
using namespace std;
typedef long long ll;
int N;
double memo[110][110][110];
double dfs(int cnt0, int cnt1, int cnt2) {
if (memo[cnt0][cnt1][cnt2] >= 0) return memo[cnt0][cnt1][cnt2];
if (cnt0 == 0 && cnt1 == 0 && cnt2 == 0) return 0;
int sum = cnt0 + cnt1 + cnt2;
double ret = N * 1.0 / sum;
if (cnt0 > 0) {
ret += (1.0*cnt0) / sum * (dfs(cnt0-1, cnt1+1, cnt2));
}
if (cnt1 > 0) {
ret += (1.0*cnt1) / sum * (dfs(cnt0, cnt1-1, cnt2+1));
}
if (cnt2 > 0) {
ret += (1.0*cnt2) / sum * (dfs(cnt0, cnt1, cnt2-1));
}
return memo[cnt0][cnt1][cnt2] = ret;
}
int main(void) {
int cnt0 = 0, cnt1 = 0, cnt2 = 0;
cin >> N;
for (int i = 0; i <= N; i++) {
for (int j = 0; j <= N; j++) {
for (int k = 0; k <= N; k++) memo[i][j][k] = -1;
}
}
for (int i = 0; i < N; i++) {
int a;
cin >> a;
if (a == 0) cnt0++;
if (a == 1) cnt1++;
if (a == 2) cnt2++;
}
printf("%.10lf\n", dfs(cnt0, cnt1, cnt2));
return 0;
}
mayoko_