白駿15961回転寿司

8828 ワード

回転寿司


問題は白駿で確認できます.

✔方法

  • デュアルポインタ問題
  • 連続ノードをブラウズする場合、範囲内の両端ノードのみを追加および削除し、重複ノードのブラウズコストを削減します.
  • から出たノード数はディックシーケンスでカウントされる.
  • クーポンノードはアザラシに反映されています.
  • ✔コード

    
    import sys, copy
    from collections import deque
    
    def solution(d,k,c,nodes):
        answer = 1
        lp, rp = 0, 0
        window = deque()
        dic_window = {(node+1):0 for node in range(d)}
        dic_window[c] += 1   # 쿠폰은 미리 추가
        max_answer = 1
        
        # 초기 k개의 노드
        for i in range(k):
            rp += 1
            window.append(nodes[i])
            dic_window[nodes[i]] += 1
            
            if dic_window[nodes[i]] == 1:
                answer += 1
    
        # 왼쪽 포인터가 마지막까지 도달하면 종료
        while( lp != len(nodes)-1 ):
    
            # 왼쪽 포인터 이동
            elem = window.popleft()
            dic_window[elem] -= 1
            lp += 1
            if dic_window[elem] == 0:
                answer -= 1
    
            # 오른쪽 포인터 이동
            window.append(nodes[rp])
            dic_window[nodes[rp]] += 1
            if dic_window[nodes[rp]] == 1:
                answer += 1
    
            rp += 1
            # 오른쪽 노드는 넘어가면 왼쪽끝으로 이동
            if rp == len(nodes) :
                 rp = 0
    
            if answer > max_answer:
                max_answer = answer
    
    
        # print(window)
        print(max_answer)
    
        return
    
    
    if __name__ == "__main__":
        N, d, k, c = map(int, input().split())
        nodes = []
        for _ in range(N):
            nodes.append(int(sys.stdin.readline().rstrip()))
        solution(d, k, c, nodes)

    チップ

  • の3つを使用して繰り返し検査を行うことができますが、2つの要素がある場合、処理は複雑になります.
    そのため、ディックシャーナを使ったほうがいいです.
  • クーポンはよく反映されるので、早めに追加できます.