結果
| 問題 |
No.174 カードゲーム(Hard)
|
| コンテスト | |
| ユーザー |
沙耶花
|
| 提出日時 | 2021-11-03 17:05:40 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 386 ms / 2,000 ms |
| コード長 | 1,306 bytes |
| コンパイル時間 | 5,271 ms |
| コンパイル使用メモリ | 255,468 KB |
| 最終ジャッジ日時 | 2025-01-25 11:04:18 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 12 |
ソースコード
#include <stdio.h>
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace atcoder;
using mint = modint;
using namespace std;
#define rep(i,n) for (int i = 0; i < (n); ++i)
#define Inf 2000000000
int main(){
int N;
cin>>N;
double Pa,Pb;
cin>>Pa>>Pb;
vector<double> dpa(1<<N,0.0),dpb(1<<N,0.0);
dpa[0] = 1.0;
dpb[0] = 1.0;
vector pa(N,vector<double>(N,0.0));
vector pb(N,vector<double>(N,0.0));
rep(i,1<<N){
bool f = true;
rep(j,N){
if((i>>j)&1)continue;
int n = __builtin_popcount(i);
double pp;
if(n==N-1)pp = 1.0;
else if(f)pp = Pa;
else pp = (1.0-Pa) * (1.0 / (N-n-1));
f = false;
pp *= dpa[i];
pa[n][j] += pp;
dpa[i|(1<<j)] += pp;
}
}
rep(i,1<<N){
bool f = true;
rep(j,N){
if((i>>j)&1)continue;
int n = __builtin_popcount(i);
double pp;
if(n==N-1)pp = 1.0;
else if(f)pp = Pb;
else pp = (1.0-Pb) * (1.0 / (N-n-1));
f = false;
pp *= dpb[i];
pb[n][j] += pp;
dpb[i|(1<<j)] += pp;
}
}
vector<int> a(N),b(N);
rep(i,N)cin>>a[i];
rep(i,N)cin>>b[i];
sort(a.begin(),a.end());
sort(b.begin(),b.end());
double ans = 0.0;
rep(i,N){
rep(j,N){
if(a[i]<b[j])continue;
rep(k,N){
ans += pa[k][i] * pb[k][j] * (a[i]+b[j]);
}
}
}
cout<<fixed<<setprecision(15)<<ans<<endl;
return 0;
}
沙耶花