Processing math: 0%

2020年5月28日木曜日

2020 Humbleool Cup Prelims

 オンサイトか何か(?)の予選で、Div.1、Div.2混合回。
 Div.2の難易度で、全完しないとまずいセットだったのに、Hardをミスして落とす。
 それでも、緑から青に戻ったけれど、これは出なくても良かったかなぁ、という気持ちになりました。

 なお、MedはPython最速だったらしく公式ページに自分の実装が載っています。

CardDrawPoints

 カードの枚数の制約が少ないことからも分かる通り、bit DPをする問題。
 どのカードを使った/使ってないか、の期待値をbit DPで計算すればOK。
 floatで割り算して誤差が大丈夫か不安だったけれど、それも問題なかった。

 コンテスト中は、残り枚数が0枚のときに、0除算して落としてしまった。ちゃんと気を付けないと!

 一応、システムテストを通ったコードを載せておきます。


  1. class CardDrawPoints():
  2. def expectedScore(self, count):
  3. LEN=len(count)
  4. if max(count)==0 or len(count)==1:
  5. return 0
  6.  
  7. LIST=[-1]*(1<<LEN)
  8. def calc(A):
  9. if LIST[A]!=-1:
  10. return LIST[A]
  11. rest=[0]*LEN
  12. NOW=0
  13.  
  14. for i in range(LEN):
  15. rest[i]=count[i]
  16. if A & (1<<i)!=0 and count[i]>0:
  17. NOW+=i
  18. rest[i]-=1
  19.  
  20. SUM=sum(rest)
  21.  
  22. if SUM==0:
  23. return NOW
  24.  
  25. ANS=float(0)
  26.  
  27. for i in range(LEN):
  28. if A & (1<<i)!=0:
  29. continue
  30. else:
  31. ANS+=float(calc(A|(1<<i)))*rest[i]/SUM
  32.  
  33. if NOW>ANS:
  34. LIST[A]=NOW
  35. return NOW
  36. else:
  37. LIST[A]=ANS
  38. return ANS
  39.  
  40. for i in range((1<<LEN)-1,-1,-1):
  41. calc(i)
  42.  
  43. return LIST[0]

0 件のコメント:

コメントを投稿