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 件のコメント:
コメントを投稿