結果
| 問題 |
No.174 カードゲーム(Hard)
|
| コンテスト | |
| ユーザー |
mayoko_
|
| 提出日時 | 2015-03-29 09:52:58 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 423 ms / 2,000 ms |
| コード長 | 2,041 bytes |
| コンパイル時間 | 1,362 ms |
| コンパイル使用メモリ | 163,008 KB |
| 実行使用メモリ | 20,096 KB |
| 最終ジャッジ日時 | 2024-07-06 21:38:37 |
| 合計ジャッジ時間 | 5,334 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 12 |
ソースコード
#include <bits/stdc++.h>
#define rep(i, n) for (int (i) = 0; (i) < (int)(n); (i)++)
const int dx[] = {1, 0, -1, 0};
const int dy[] = {0, 1, 0, -1};
using namespace std;
typedef long long ll;
const int MAXN = 20;
double dp[2][1<<MAXN];
int A[MAXN], B[MAXN];
double dpdp[2][MAXN][MAXN];
int main() {
int N;
double p[2];
cin >> N >> p[0] >> p[1];
for (int i = 0; i < N; i++) cin >> A[i];
for (int i = 0; i < N; i++) cin >> B[i];
sort(A, A+N);
sort(B, B+N);
dp[0][(1<<N)-1] = dp[1][(1<<N)-1] = 1;
for (int j = 0; j < 2; j++) {
for (int s = (1<<N)-2; s >= 1; s--) {
bool first = true;
int cnt = __builtin_popcount(s);
for (int i = 0; i < N; i++) {
if ((s>>i)&1) first = false;
else {
if (first) dp[j][s] += dp[j][s|(1<<i)]*p[j];
else dp[j][s] += dp[j][s|(1<<i)]*(1-p[j])/cnt;
}
}
}
}
for (int i = 0; i < N; i++) dp[0][0] += dp[0][(1<<i)];
for (int j = 0; j < 2; j++) {
for (int s = 1; s < (1<<N); s++) {
int cnt = __builtin_popcount(s);
bool first = true;
for (int i = 0; i < 20; i++) {
if ((s>>i)&1) {
if (cnt == 1) dpdp[j][N-cnt][i] += dp[j][s];
else {
if (first) {
first = false;
dpdp[j][N-cnt][i] += dp[j][s] * p[j];
} else {
dpdp[j][N-cnt][i] += dp[j][s] * (1-p[j])/(cnt-1);
}
}
}
}
}
}
double ans = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
for (int k = 0; k < N; k++) {
if (A[j] > B[k]) {
ans += (A[j]+B[k]) * dpdp[0][i][j] * dpdp[1][i][k];
}
}
}
}
printf("%.15lf\n", ans);
return 0;
}
mayoko_