結果
問題 | No.174 カードゲーム(Hard) |
ユーザー | kenkoooo |
提出日時 | 2015-03-29 08:36:50 |
言語 | Java (openjdk 23) |
結果 |
AC
|
実行時間 | 131 ms / 2,000 ms |
コード長 | 2,038 bytes |
コンパイル時間 | 2,247 ms |
コンパイル使用メモリ | 78,048 KB |
実行使用メモリ | 56,080 KB |
最終ジャッジ日時 | 2024-07-06 21:38:09 |
合計ジャッジ時間 | 3,924 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 12 |
ソースコード
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); } }