memo

GitHub: izuna385

AtCoder Beginner Contest 032 C 列 (しゃくとり法)

 C++始めると言ったのに最近精進できていない。D問題に解けるものが無く一つの壁に来た感じがある(典型アルゴやれ)

問題

https://beta.atcoder.jp/contests/abc032/tasks/abc032_c 
部分列に含まれる全ての要素の値の積が、K 以下であるようなものの最長列を求める。

解法

しゃくとり法が手っ取り早い

コード(Python

微調整を繰り返したので、釈然としないしゃくとり法になった。

他にもどこをインデックスとして回すかは問題に依るので、もっと柔軟に書けるようにしておく必要がある。

n,k = map(int,input().split())
sl = []
for i in range(n):
    sl.append(int(input()))
left = 0 
right = 0    
kouho = 0
seki = 1
for i in range(n):
    
    if sl[i] == 0:
        break
    
    right = i
    if i == 0:
        seki = sl[left]
    else:
        seki = seki * sl[right]
        
    if seki <= k:
        kouho = max(kouho,right-left+1)
        continue
    else:
        while left <= right and seki > k:
            p = left
            seki = seki / sl[p]
            left = left + 1

if 0 in sl:
    kouho = n
print(kouho)