1.這題先前已經問了兩次,都問不到答案才來貼題目
2.這不是作業,這是程設競賽的題目(國中組的題目),會的人可以寫寫看
以下拋個磚引個玉
import sys
def oneday(lst, max):
ret = []
for i in lst:
ret.append(min(i+1,max))
for j in range(i):
ret.append(1)
return ret
def onecase(n, k):
lstv = [1]
for i in range(n):
lstv = oneday(lstv, k)
if len(lstv) > 98765432123456789:
return 98765432123456789
return(len(lstv))
for line in sys.stdin:
nk = line.split()
if len(nk) == 2:
n = int(nk[0])
k = int(nk[1])
print(onecase(n, k))
這題沒明確定義,每天增加的等級,那就是NULL,既然是NULL,那就是NULL到底了.
等級每天增加1,不超過上限k
完整題目可參考原始題目(Q4)
考慮到 k 很大或是 n 很大的狀況
def onecase(n, k):
lstv = [1]
total = 1
count = 1
m = min(n+1, k)
# 第一階段:1 ~ k-1 天,此時 lstv 長度會到 k
for i in range(1, m):
addVal = 0
for j in range(count):
addVal += lstv[j] * (i - j)
lstv.append(addVal)
count = count + 1
total += addVal
if total >= 98765432123456789:
return 98765432123456789
# 第二階段:k-1 ~ n 天,不再增加 lstv 長度
for i in range(m, n+1):
addVal = lstv[k-1]
for j in range(k-1):
addVal += lstv[j] * (k - j)
lstv[j] = (lstv[j+1] if j > 0 else lstv[j+1] + lstv[j])
lstv[k-1] = (addVal if k > 1 else addVal + lstv[k-1])
total += addVal
if total >= 98765432123456789:
return 98765432123456789
return total
考慮到 k 很大或是 n 很大的狀況
可能有點誤會
n 是天數;k 是等級上限
而 k 並不必然小於 n
海綿寶寶
我注釋的方式會讓人誤會
如果 k > n 的話
第二階段的迴圈其實不會跑,會直接結束回傳
拿一些資料測試,目前跟你的輸出是一樣的
for n in range(5):
for k in range(1,5):
if onecase(n, k) == onecaseOrig(n, k):
print("n={}, k={} pass".format(n,k))
else:
print("[err] n={}, k={} diff".format(n,k))
站內通知部分我收到最近的是 5/11
不過我好像比較少用回答,所以不知道正常不正常
卡關,具體說出哪裡不懂,或是卡住的地方,很多人都會幫忙.
若真的毫無頭緒,或是無法表達出來,可以多尋求另外的管道吧.