結果

問題 No.174 カードゲーム(Hard)
ユーザー kenkooookenkoooo
提出日時 2015-03-29 08:36:50
言語 Java21
(openjdk 21)
結果
AC  
実行時間 146 ms / 2,000 ms
コード長 2,038 bytes
コンパイル時間 2,083 ms
コンパイル使用メモリ 73,820 KB
実行使用メモリ 56,252 KB
最終ジャッジ日時 2023-09-21 02:57:53
合計ジャッジ時間 4,549 ms
ジャッジサーバーID
(参考情報)
judge15 / judge12
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 135 ms
56,192 KB
testcase_01 AC 137 ms
56,068 KB
testcase_02 AC 144 ms
56,080 KB
testcase_03 AC 143 ms
55,800 KB
testcase_04 AC 142 ms
55,732 KB
testcase_05 AC 143 ms
56,192 KB
testcase_06 AC 146 ms
55,680 KB
testcase_07 AC 144 ms
56,252 KB
testcase_08 AC 145 ms
55,928 KB
testcase_09 AC 143 ms
55,744 KB
testcase_10 AC 135 ms
55,920 KB
testcase_11 AC 136 ms
56,072 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	static int GETA = 20005;
	static int MAX = 40010;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();

		double[] P = new double[2];
		for (int i = 0; i < 2; i++) {
			P[i] = sc.nextDouble();
		}

		int[] a = new int[N];
		for (int i = 0; i < a.length; i++) {
			a[i] = sc.nextInt();
		}
		int[] b = new int[N];
		for (int i = 0; i < b.length; i++) {
			b[i] = sc.nextInt();
		}
		sc.close();

		Arrays.sort(a);
		Arrays.sort(b);

		// probability[player][turn][x]:=playerがturnにxのカードを出す確率
		double[][][] probability = new double[2][N][N];
		for (int player = 0; player < 2; player++) {
			for (int j = 0; j < N; j++) {
				// jが出される確率を求める

				// dp[k]:= turnにjより小さいカードがk枚残り、かつjが残っている確率
				double[] dp = new double[N];
				dp[j] = 1;
				for (int turn = 0; turn < N; turn++) {
					if (turn == N - 1) {
						// 最終ターン
						probability[player][N - 1][j] = dp[0];
						break;
					}

					// dp[0]:= jが残っていて、かつ、jが最小の確率
					probability[player][turn][j] += P[player] * dp[0];
					dp[0] *= (1 - P[player]);

					// turnでの残りカード枚数
					int totalCardNum = N - turn - 1;

					// 最小以外のカードが出る1枚あたりの確率
					double Prest = (1 - P[player]) / totalCardNum;

					for (int card = 1; card < N; card++) {
						dp[card - 1] += dp[card] * (P[player] + (card - 1) * Prest);

						probability[player][turn][j] += dp[card] * Prest;
						if (totalCardNum - card >= 0) {
							dp[card] *= (totalCardNum - card) * Prest;
						}
					}

				}
			}
		}

		double ans = 0;
		for (int turn = 0; turn < N; turn++) {
			for (int i = 0; i < N; i++) {
				for (int j = 0; j < N; j++) {
					if (a[i] > b[j]) {
						ans += probability[0][turn][i] * probability[1][turn][j] * (a[i] + b[j]);
					}
				}
			}

		}
		System.out.println(ans);

	}
}
0