結果

問題 No.2158 X日後に全完するhibit君
ユーザー shobonvipshobonvip
提出日時 2022-12-09 23:00:51
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 99 ms / 2,000 ms
コード長 1,271 bytes
コンパイル時間 257 ms
コンパイル使用メモリ 82,040 KB
実行使用メモリ 77,008 KB
最終ジャッジ日時 2024-10-14 22:45:14
合計ジャッジ時間 2,605 ms
ジャッジサーバーID
(参考情報)
judge2 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 25
権限があれば一括ダウンロードができます

ソースコード

diff #

from collections import defaultdict
n,k = map(int,input().split())
p = [0] * n
s = [0] * n
t = [0] * n
for i in range(n):
	p[i], s[i], t[i] = map(int,input().split())

if sum(t) > 60:
	print(-1)
	exit()

g = defaultdict(lambda:-1)
minans = 9999999999999
maxans = 0

def dfs(date, used, unused):
	global minans, maxans, k
	targ = (date << 50) + (used << 25) + unused
	if g[targ] >= 0:
		return g[targ]
	l = 1
	ul = [0] * n
	unl = [0] * n
	if date >= k+2:
		for i in range(n):
			used += 6 ** i
	rrr = 1
	for i in range(n):
		ul[i] += (used // rrr) % 6
		unl[i] += (unused // rrr) % 6
		rrr *= 6
	#print(ul, unl)
	ret = 0
	for i in range(1 << n):
		l = 1
		nused = used
		nunused = unused
		mode = 1
		T = 0
		for j in range(n):
			if i >> j & 1:
				if ul[j] == 0:
					mode = 0
					break
				l *= ul[j] / (ul[j] + unl[j])
				T += t[j]
				nused -= 6 ** j
			else:
				if unl[j] == 0:
					mode = 0
					break
				l *= unl[j] / (ul[j] + unl[j])
				T += s[j]
				nunused -= 6 ** j
		if mode:
			if T <= 60:
				ret += l * date
				minans = min(date, minans)
				maxans = max(date, maxans)
			else:
				ret += l * dfs(date + 1, nused, nunused)
	g[targ] = ret
	return ret

start = 0
for i in range(n):
	start += p[i] * 6 ** i

r = dfs(1, 0, start)
print(minans, maxans, r)
0