結果
問題 | No.1151 チャレンジゲーム |
ユーザー |
|
提出日時 | 2020-08-07 23:40:30 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 62 ms / 2,000 ms |
コード長 | 1,686 bytes |
コンパイル時間 | 1,647 ms |
コンパイル使用メモリ | 167,400 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-09-25 01:06:48 |
合計ジャッジ時間 | 4,805 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 50 |
ソースコード
#include <bits/stdc++.h>#define MOD 1000000007LLusing namespace std;typedef long long ll;typedef pair<int,int> P;int n;int a[11];double dp[2][60000];bool flag[2][60000];bool used(int pos,int bit){for(int i=0;i<pos;i++){bit/=3;}if(bit%3!=0)return true;return false;}double solve(int v,int bit){if(flag[v][bit]){return dp[v][bit];}flag[v][bit]=true;double ans=0.0;if(v==1){ans=1.0;}int kg=1;for(int i=0;i<n;i++){if(used(i,bit)){kg*=3;continue;}double val=1.0;if(v==1){val=0.0;}double v1=1.0/(double)a[i]*solve(1-v,bit+(kg)*(1+v));int kg2=1;for(int j=0;j<n;j++){if(used(j,bit)){kg2*=3;continue;}double v2=(1.0-1.0/(double)a[i])*(1.0/(double)a[j])*solve(v,bit+kg2*(2-v));double pi=(1.0-1.0/(double)a[i])*(1.0-1.0/(double)a[j]);pi=1.0-pi;double v3=(v1+v2)/pi;//printf("%d %d %d %d %.5f %.5f %.5f %.10f\n",v,bit,i,j,v1,v2,pi,v3);if(v==0){val=min(val,v3);}else{val=max(val,v3);}kg2*=3;}if(v==0){ans=max(ans,val);}else{ans=min(ans,val);}kg*=3;}//printf("%d %d ans= %.10f\n",v,bit,ans);return dp[v][bit]=ans;}int main(void){scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&a[i]);}for(int i=0;i<(1<<n);i++){int val=0;int bit=0;int k=1;for(int j=0;j<n;j++){if((i>>j)&1){bit+=k;val+=a[j];}else{bit+=2*k;val-=a[j];}k*=3;}if(val>0){dp[0][bit]=1.0;dp[1][bit]=1.0;flag[0][bit]=true;flag[1][bit]=true;}else{dp[0][bit]=0.0;dp[1][bit]=0.0;flag[0][bit]=true;flag[1][bit]=true;}}printf("%.10f\n",solve(0,0));return 0;}