結果

問題 No.108 トリプルカードコンプ
コンテスト
ユーザー Unbakedbread
提出日時 2026-01-01 16:19:13
言語 C++23
(gcc 15.2.0 + boost 1.89.0)
結果
AC  
実行時間 243 ms / 5,000 ms
コード長 835 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 3,618 ms
コンパイル使用メモリ 288,368 KB
実行使用メモリ 14,848 KB
最終ジャッジ日時 2026-01-01 16:19:19
合計ジャッジ時間 5,404 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 20
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
using namespace std;

int main(void) {
	cout << fixed << setprecision(30);
	
	int N;
	cin >> N;
	vector<int> A(N);
	for(int i = 0; i < N; ++i) cin >> A[i];
	
	vector<int> cnt(4, 0);
	for(int i = 0; i < N; ++i) cnt[min(3, A[i])] += 1;
	
	map<tuple<int, int, int>, double> m;
	auto solve = [&](auto &&solve, int c0, int c1, int c2) ->double {
		if(c0 == 0 and c1 == 0 and c2 == 0) return 0;
		auto t = make_tuple(c0, c1, c2);
		if(m.find(t) != m.end()) return m[t];
		
		double sum = c0 + c1 + c2, ans = N / sum;
		if(c0 != 0) ans += solve(solve, c0 - 1, c1 + 1, c2) * (c0 / sum);
		if(c1 != 0) ans += solve(solve, c0, c1 - 1, c2 + 1) * (c1 / sum);
		if(c2 != 0) ans += solve(solve, c0, c1, c2 - 1) * (c2 / sum);
		
		return m[t] = ans;
	};
	
	cout << solve(solve, cnt[0], cnt[1], cnt[2]) << "\n";
	
	return 0;
}
0