Div.2の難易度で、全完しないとまずいセットだったのに、Hardをミスして落とす。
それでも、緑から青に戻ったけれど、これは出なくても良かったかなぁ、という気持ちになりました。
なお、MedはPython最速だったらしく公式ページに自分の実装が載っています。
CardDrawPoints
カードの枚数の制約が少ないことからも分かる通り、bit DPをする問題。
どのカードを使った/使ってないか、の期待値をbit DPで計算すればOK。
floatで割り算して誤差が大丈夫か不安だったけれど、それも問題なかった。
コンテスト中は、残り枚数が0枚のときに、0除算して落としてしまった。ちゃんと気を付けないと!
一応、システムテストを通ったコードを載せておきます。
一応、システムテストを通ったコードを載せておきます。
- class CardDrawPoints():
- def expectedScore(self, count):
- LEN=len(count)
- if max(count)==0 or len(count)==1:
- return 0
- LIST=[-1]*(1<<LEN)
- def calc(A):
- if LIST[A]!=-1:
- return LIST[A]
- rest=[0]*LEN
- NOW=0
- for i in range(LEN):
- rest[i]=count[i]
- if A & (1<<i)!=0 and count[i]>0:
- NOW+=i
- rest[i]-=1
- SUM=sum(rest)
- if SUM==0:
- return NOW
- ANS=float(0)
- for i in range(LEN):
- if A & (1<<i)!=0:
- continue
- else:
- ANS+=float(calc(A|(1<<i)))*rest[i]/SUM
- if NOW>ANS:
- LIST[A]=NOW
- return NOW
- else:
- LIST[A]=ANS
- return ANS
- for i in range((1<<LEN)-1,-1,-1):
- calc(i)
- return LIST[0]
0 件のコメント:
コメントを投稿