結果
問題 | No.66 輝け☆全国たこやき杯 |
ユーザー |
![]() |
提出日時 | 2016-09-23 19:50:57 |
言語 | C++11 (gcc 13.3.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,124 bytes |
コンパイル時間 | 459 ms |
コンパイル使用メモリ | 59,168 KB |
実行使用メモリ | 13,744 KB |
最終ジャッジ日時 | 2024-11-17 19:52:50 |
合計ジャッジ時間 | 1,097 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 3 WA * 7 |
ソースコード
#include <iostream>#include <cstdio>#include <cmath>typedef long long ll;using namespace std;#define rep(i,n) for(int i=0;i<(n);i++)//dp[i][j] := i回回目の試合にj番目のひとが勝つ確率double dp[12][1200];int m;double s[1200];//memo[i][j] := iとjが戦い、i番目の人が勝つ確率double memo[1200][1200];int main(void){cin >> m;rep(i, pow(2, m)) cin >> s[i];rep(i, pow(2, m))rep(j, pow(2, m)){memo[i][j] = pow(s[i], 2.0) / (pow(s[i], 2.0) + pow(s[j], 2.0));}//確率dp (可能性のある対戦相手を探すのが難しい)rep(i, 12)rep(j, 1200) dp[i][j] = 0.0;rep(i, 12)dp[0][i] = 1.0;int mask = 0xFFFFFF;for (int i = 0; i < m; ++i){//何試合目mask -= 1 << i;for (int x = 0; x < (1 << m); ++x){//戦う人の番号(勝率を求める側)for (int y = 0; y < (1 << m); ++y){//i試合目に戦う可能性のある相手を探すif(x == y)continue;if(((x ^ y) & (1 << i)) != 0 && (x & mask) == (y & mask)){//ここが難しいdp[i + 1][x] += dp[i][x] * dp[i][y] * memo[x][y];}}}}printf("%.9f\n", dp[m][0]);return 0;}