結果
| 問題 | No.155 生放送とBGM |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2015-06-04 00:25:10 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 2,128 ms / 6,000 ms |
| コード長 | 924 bytes |
| コンパイル時間 | 246 ms |
| コンパイル使用メモリ | 82,176 KB |
| 実行使用メモリ | 263,712 KB |
| 最終ジャッジ日時 | 2024-07-06 14:04:19 |
| 合計ジャッジ時間 | 6,442 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 15 |
ソースコード
from itertools import zip_longest as zl
from math import factorial as f
N,L=map(int,input().split())
L*=60
M=[]
for s in input().split():
a,b = map(int,s.split(':'))
M+=[a*60+b]
def G(M,dp,l,u):
m=len(M)//2
if m==0:
t=max(len(dp[0])-M[0],0)
return [sum(d[t:]) for d in dp]
A=G(M[m:],*D(M[:m],dp,l[:],u[:]))
B=G(M[:m],*D(M[m:],dp,l[:],u[:]))
return [a+b for a,b in zl(A,B,fillvalue=0)]
def D(M,d0,l,u):
dp=[d[:] for d in d0]
for m in M:
k=len(dp)-1
if l[k]+m<L: dp.append([0]*L)
for n in range(k, -1, -1):
if l[n]>=L-m: continue
nl=l[n]+m
l[n+1]=min(l[n+1],nl)
nu=min(u[n]+m,L-1)
u[n+1]=max(u[n+1],nu)
dp[n+1][nl:nu+1]=[a+b for a,b in zip(dp[n+1][nl:nu+1], dp[n][l[n]:u[n]+1])]
return dp, l, u
if sum(M)<=L:
a=N
else:
dp=[[0]*L]
dp[0][0]=1
l=[0]+[L]*N
u=[0]*(N+1)
a=sum(v*f(n)*f(N-n) for n,v in enumerate(G(M,dp,l,u),1))/f(N)
print(a)