白駿-10816デジタルカード2
1992 ワード
質問する😀
BSで解題しようとしたが、タイムアウトで解題できなかった.
そこで解法を探す中で下界と上界の概念を見つけた.
コンセプト😃
下限は、初期位置(ターゲットパラメータ以上)を見つけます.
上界は目標数を超える初期位置を探し出す.
もちろん、下界と上界もBSのようにデータを揃えます.
1 2 2 4 5 5 8 10の数列があると言ってください.ここでtargetは5の下限と上限を検索する
BSは、任意のターゲットが見つかった後に戻っても差し支えないアルゴリズムであるが、下付きおよび上付きはstart
コード#コード#😁
import sys
N = int(sys.stdin.readline().rstrip())
cards = list(map(int, sys.stdin.readline().rstrip().split()))
M = int(sys.stdin.readline().rstrip())
nums = list(map(int, sys.stdin.readline().rstrip().split()))
cards.sort()
def upper_bound(start, end, target):
while start < end:
mid = (start + end) // 2
if target >= cards[mid]:
start = mid + 1
else:
end = mid
return end + 1
def lowr_bound(start, end, target):
while start < end:
mid = (start + end) // 2
if target > cards[mid]:
start = mid + 1
else:
end = mid
return end + 1
for num in nums:
print(upper_bound(0, len(cards), num) - lowr_bound(0, len(cards), num), end=' ')
upper boundとlower boundの違いから,if target > cards[mid]:
とif target >= cards[mid]:
の部分に差があることがわかる.upper_bound는 target
とcards[mid]
が同じであっても、start = mid + 1
が位置調整を継続していることがわかる.これにより、targetを超える最初のインデックスを求めることができます.この問題のエラー部分はendのパラメータで渡された値によってエラーがある.
適切な値は、upper boundおよびlower boundから
len(cards) - 1
に戻るため、endに渡された値がlen(cards)
ではなくend + 1
に渡されてこそ導出される.に感銘を与える🤣
Reference
この問題について(白駿-10816デジタルカード2), 我々は、より多くの情報をここで見つけました https://velog.io/@yjs3819/백준-10816-숫자카드-2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol