[明日の学習キャンプ]#211026💻 TIL 💻


📚 TIL


📌 今日の質問


✔白準2805樹剪断(二分探索アルゴリズム)

N,M=map(int,input().split(' '))
trees=list(map(int,input().split(' ')))
left=1
max_height=0
right=max(trees)-1
while left<=right:
    #설정한 절단기 높이
    mid=(left+right)//2
 
    #상근이가 가져가는 나무의 길이
    total=0
    for tree in trees:
        result=tree-mid
        if result>0:
            total+=result
    if total>M:
        max_height=max(max_height,mid)
        left=mid+1
    elif total==M:
        max_height = max(max_height, mid)
        break
    else:
        right=mid-1

print(max_height)
pythonはタイムアウトし、pypy 3で解読しました.
最初はMより大きい場合、答えが見つかるとは思わなかったが、Mと同じ場合に限って、止まって答えを求める.
しかし同じではない場合もあり得るが,この場合Mが生み出す最大高さを求める必要がある.
だから状況を3つに分けて問題を解く.

10004 Q 1021回転キュー(スタック、キューアルゴリズム)

# 데크
import sys
from collections import deque

input = sys.stdin.readline  # 빠른 입력
N, M = map(int, input().split())
loc = list(map(int, input().split()))

deque = deque([i for i in range(1, N+1)])

find = 0
count = 0

while (True):

    if deque[0] == loc[find]:
        deque.popleft()
        find += 1
        if find == M:
            break
    else:

        if deque.index(loc[find]) < abs(deque.index(loc[find]) - len(deque)):
            deque.append(deque.popleft())
        else:
            # 3번의 경우
            deque.appendleft(deque.pop())
        count += 1

print(count)
今回はdequeにindexメソッドがないと思っていたので、質問に答えられませんでした.
でも私が以前解いていたコードを見ると、インデックスの仕方がとても良かったです^^
一時間も悩んだような….ほほほ
  • 最初に検索する数字はリストに、1からNの数字はDequeの
  • に、
  • 個の数字を順番に並べ、検索する数字が0番のインデックスにある場合は、1個の数字をポップアップして検索し、+=1を検索します.
  • で検索された数字が0番インデックスに含まれていない場合、dequeはインデックスを検索し、2番演算を行うか3番演算を行うかを決定するアルゴリズムがpointです.
  • 8ヶ月前に解いたが、アルゴリズムの問題はまだ努力している.ほほほ
    この時ほど上達した実力はないようです.
    今日私は再び解くことが大切だと気づいた.