結果
| 問題 |
No.174 カードゲーム(Hard)
|
| コンテスト | |
| ユーザー |
chocorusk
|
| 提出日時 | 2020-02-03 02:27:34 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
MLE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 2,178 bytes |
| コンパイル時間 | 1,124 ms |
| コンパイル使用メモリ | 113,176 KB |
| 実行使用メモリ | 257,792 KB |
| 最終ジャッジ日時 | 2024-09-18 21:37:21 |
| 合計ジャッジ時間 | 7,439 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 4 MLE * 8 |
ソースコード
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <cmath>
#include <bitset>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <algorithm>
#include <complex>
#include <unordered_map>
#include <unordered_set>
#include <random>
#include <cassert>
#include <fstream>
#include <utility>
#include <functional>
#include <time.h>
#include <stack>
#include <array>
#define popcount __builtin_popcount
using namespace std;
typedef long long int ll;
typedef pair<ll, ll> P;
double dpa[20][1<<20], dpb[20][1<<20];
int main()
{
int n;
double pa, pb;
cin>>n>>pa>>pb;
int a[20], b[20];
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);
for(int i=1; i<n; i++){
dpa[i][1<<i]=(1-pa)/(n-1);
dpb[i][1<<i]=(1-pb)/(n-1);
}
if(n>1) dpa[0][1]=pa, dpb[0][1]=pb;
else dpa[0][1]=dpb[0][1]=1;
for(int i=1; i<(1<<n)-1; i++){
double s=0; int c=0;
for(int j=0; j<n; j++){
if(i&(1<<j)) s+=dpa[j][i];
else c++;
}
bool myon=0;
for(int j=0; j<n; j++){
if(i&(1<<j)) continue;
if(!myon){
if(c>1) dpa[j][i^(1<<j)]+=s*pa;
else dpa[j][i^(1<<j)]+=s;
}else{
dpa[j][i^(1<<j)]+=s*(1-pa)/(c-1);
}
myon=1;
}
}
for(int i=1; i<(1<<n)-1; i++){
double s=0; int c=0;
for(int j=0; j<n; j++){
if(i&(1<<j)) s+=dpb[j][i];
else c++;
}
bool myon=0;
for(int j=0; j<n; j++){
if(i&(1<<j)) continue;
if(!myon){
if(c>1) dpb[j][i^(1<<j)]+=s*pb;
else dpb[j][i^(1<<j)]+=s;
}else{
dpb[j][i^(1<<j)]+=s*(1-pb)/(c-1);
}
myon=1;
}
}
double ans=0;
double qa[20][21]={}, qb[20][21]={};
for(int i=1; i<(1<<n); i++){
int c=popcount(i);
for(int j=0; j<n; j++){
if(i&(1<<j)){
qa[j][c]+=dpa[j][i];
qb[j][c]+=dpb[j][i];
}
}
}
for(int i=1; i<=n; i++){
for(int j=0; j<n; j++){
for(int k=0; k<n; k++){
if(a[j]<b[k]) continue;
ans+=(a[j]+b[k])*qa[j][i]*qb[k][i];
}
}
}
printf("%.10lf\n", ans);
return 0;
}
chocorusk