結果
問題 | No.1590 Random Shopping |
ユーザー |
👑 ![]() |
提出日時 | 2021-07-09 18:19:42 |
言語 | PyPy3 (7.3.15) |
結果 |
MLE
|
実行時間 | - |
コード長 | 1,843 bytes |
コンパイル時間 | 160 ms |
コンパイル使用メモリ | 82,392 KB |
実行使用メモリ | 849,360 KB |
最終ジャッジ日時 | 2024-07-01 14:02:14 |
合計ジャッジ時間 | 6,583 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | -- * 3 |
other | AC * 14 MLE * 1 -- * 10 |
ソースコード
"""https://yukicoder.me/problems/no/1590分からなければさっさと見ちゃおうかな寄与を考えるよねx人目がy番目の商品を買う確率がわかればおkx,yのペアに関して求めたい=====================答えを見た出来そうなdpから結果を導出するBorderごとにdp[Border][a][b] = a日目でBorder以下がb個残っている確率とすると、a日目の人の購入額の期待値は1/2 * ( dp[B0][a][0] * B0 + dp[B1][a][0] * (B1-B0) + ... )ただし、その日の商品 A[a] < B?p[i][j] ="""from sys import stdinN = int(stdin.readline())A = list(map(int,stdin.readline().split()))R = list(map(int,stdin.readline().split()))s = set(A)s.add(0)B = list(s)B.sort()#print (B)dp = {}for Border in B:ndp = [[0] * (N+1) for i in range(N+1)]ndp[0][0] = 1for a in range(N):na = A[a]for b in range(N+1):if na <= Border:#追加して、取る場合ndp[a+1][b] += ndp[a][b] / 2#追加して、取らない場合if b != N:ndp[a+1][b+1] += ndp[a][b] / 2else:#追加はしない、取る場合ndp[a+1][max(0,b-1)] += ndp[a][b]/2#追加はしない、取らない場合ndp[a+1][b] += ndp[a][b] / 2dp[Border] = ndp#print (dp)ans = 0for a in range(1,N+1):na = A[a-1]nr = R[a-1]nsum = 0for j in range(len(B)-1):p = 0 #人aが、B[j]より大きい奴を取る確率if na <= B[j]:p = 0else:p = dp[B[j]][a-1][0] / 2#print (a,B[j],p)nsum += (B[j+1]-B[j]) * pans += nsum * nr#print (nsum * nr)print (ans)