結果
| 問題 |
No.174 カードゲーム(Hard)
|
| コンテスト | |
| ユーザー |
yaoshimax
|
| 提出日時 | 2015-05-06 18:07:04 |
| 言語 | PyPy2 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 740 ms / 2,000 ms |
| コード長 | 1,508 bytes |
| コンパイル時間 | 1,817 ms |
| コンパイル使用メモリ | 76,576 KB |
| 実行使用メモリ | 103,680 KB |
| 最終ジャッジ日時 | 2024-07-06 21:39:03 |
| 合計ジャッジ時間 | 8,561 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 12 |
ソースコード
def bitcount(N):
ans=0
while N!=0:
ans+=1
N&=N-1
return ans
N,Pa,Pb=raw_input().split()
N=int(N)
Pa,Pb=float(Pa),float(Pb)
A=map(int,raw_input().split())
B=map(int,raw_input().split())
A.sort()
B.sort()
dpb=[[0.0 for i in range(N+1)] for j in range(N+1)]
dpmaskb=[0.0 for i in range(1<<N)]
dpmaskb[(1<<N)-1]=1.0
dpa=[[0.0 for i in range(N+1)] for j in range(N+1)]
dpmaska=[0.0 for i in range(1<<N)]
dpmaska[(1<<N)-1]=1.0
b=[bitcount(i) for i in range(1<<N)]
for i in range((1<<N)-1,-1,-1):
# print "dpmaska[",i,"]=",dpmaska[i],
for j in range(N):
n=b[i]
if (i&(1<<j))!=0:
k=i-(1<<j)
if k==(i&(i-1)):
if n==1:
dpmaska[k]+=dpmaska[i]
dpmaskb[k]+=dpmaskb[i]
dpa[N-n][j]+=dpmaska[i]
dpb[N-n][j]+=dpmaskb[i]
else:
dpmaska[k]+=dpmaska[i]*Pa
dpmaskb[k]+=dpmaskb[i]*Pb
dpa[N-n][j]+=dpmaska[i]*Pa
dpb[N-n][j]+=dpmaskb[i]*Pb
else:
dpmaska[k]+=dpmaska[i]*(1.0-Pa)/(n-1)
dpmaskb[k]+=dpmaskb[i]*(1.0-Pb)/(n-1)
dpa[N-n][j]+=dpmaska[i]*(1.0-Pa)/(n-1)
dpb[N-n][j]+=dpmaskb[i]*(1.0-Pb)/(n-1)
ans=0.0
for ai in range(N):
for bi in range(N):
if A[ai] > B[bi]:
for ti in range(N):
ans+=(A[ai]+B[bi])*dpa[ti][ai]*dpb[ti][bi]
print "%.11f"%ans
yaoshimax