結果
問題 | No.1590 Random Shopping |
ユーザー |
👑 ![]() |
提出日時 | 2021-07-09 18:20:14 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,843 bytes |
コンパイル時間 | 154 ms |
コンパイル使用メモリ | 12,672 KB |
実行使用メモリ | 275,200 KB |
最終ジャッジ日時 | 2024-07-01 14:02:24 |
合計ジャッジ時間 | 9,586 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | -- * 3 |
other | AC * 12 TLE * 1 -- * 12 |
ソースコード
"""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)