結果
問題 | No.1151 チャレンジゲーム |
ユーザー |
![]() |
提出日時 | 2020-08-21 17:14:03 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 111 ms / 2,000 ms |
コード長 | 2,500 bytes |
コンパイル時間 | 1,697 ms |
コンパイル使用メモリ | 124,904 KB |
最終ジャッジ日時 | 2025-01-13 04:46:21 |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 50 |
ソースコード
#include<iostream>#include<string>#include<cstdio>#include<vector>#include<cmath>#include<algorithm>#include<functional>#include<iomanip>#include<queue>#include<ciso646>#include<random>#include<map>#include<set>#include<complex>#include<bitset>#include<stack>#include<unordered_map>#include<utility>#include<tuple>#include<cassert>using namespace std;typedef long long ll;typedef unsigned int ui;const ll mod = 1000000007;const ll INF = (ll)1000000007 * 1000000007;typedef pair<int, int> P;#define stop char nyaa;cin>>nyaa;#define rep(i,n) for(int i=0;i<n;i++)#define per(i,n) for(int i=n-1;i>=0;i--)#define Rep(i,sta,n) for(int i=sta;i<n;i++)#define Per(i,sta,n) for(int i=n-1;i>=sta;i--)#define rep1(i,n) for(int i=1;i<=n;i++)#define per1(i,n) for(int i=n;i>=1;i--)#define Rep1(i,sta,n) for(int i=sta;i<=n;i++)typedef long double ld;const ld eps = 1e-8;const ld pi = acos(-1.0);typedef pair<ll, ll> LP;int dx[4]={1,-1,0,0};int dy[4]={0,0,1,-1};int n,N=1;ld a[15];ld dp[2][100050];int po[15];int inv(int S){int T=0;rep(i,n){if(S%3!=0){T+=po[i]*(3-S%3);}S/=3;}return T;}ld get_dp(int turn,int S){if(dp[turn][S]!=-1) return dp[turn][S];vector<int> used(n);int S_=S;bool flag=true;rep(i,n){used[i]=S_%3;if(S_%3==0) flag=false;S_/=3;}if(flag){int point=0;rep(i,n){if(used[i]==1) point+=a[i];else point-=a[i];}dp[turn][S]=(point>0);return dp[turn][S];}ld ma=0;if(turn==1) ma=1;rep(i,n){if(used[i]!=0) continue;ld mi=1;if(turn==1)mi=0;rep(j,n){if(used[j]!=0) continue;ld p=a[j]/(a[i]+a[j]-1);ld res=p*(get_dp(1-turn,S+(1+turn)*po[i]))+(1-p)*get_dp(turn,S+(2-turn)*po[j]);if(turn==0)mi=min(mi,res);if(turn==1)mi=max(mi,res);}if(turn==0)ma=max(mi,ma);if(turn==1)ma=min(mi,ma);}dp[turn][S]=ma;return dp[turn][S];}void solve(){cin >> n;po[0]=1;rep(i,n){po[i+1]=3*po[i];}//cout << 5 << " " << inv(5) << endl;rep(i,n) cin >> a[i];rep(i,n) N*=3;rep(k,2) rep(i,N) dp[k][i]=-1;// rep(p,2) rep(S,N){// cout << p << endl;// int S_=S;// rep(i,n){// cout << S_%3 << " ";// S_/=3;// }// // cout << "" << endl;// // cout << get_dp(p,S) << endl;// }cout << get_dp(0,0) << endl;}int main(){ios::sync_with_stdio(false);cin.tie(0);cout << fixed << setprecision(50);solve();}