다른 사이트들을 보고 참고했다. 특히 코드는 그대로 따라함.
# https://ggodong.tistory.com/90 # https://herong.tistory.com/entry/SWEA-3813-%EA%B7%B8%EB%9E%98%EB%8F%84-%EC%88%98%EB%AA%85%EC%9D%B4-%EC%A0%88%EB%B0%98%EC%9D%B4-%EB%90%98%EC%96%B4%EC%84%9C%EB%8A%94
일단 주어진 배열에서 "이 값이면 정답일까?" 하고 배열에서 최소값과 최대값의 중간값을 가정하고 풀어나간다. (위 스크린샷에선 확인해볼라고 임시로 0~20으로 지정함.)
만약 임시로 잡은 중간값이 정답이라면 이거보다 더 작은값도 정답일 확률이 있으므로 end값을 반으로 줄이고 실험.
중간값이 정답이 아니라면 중간값보다는 더 커야 하므로 start를 중간값+1로 지정하고 계산.
이런식으로 거꾸로 역추적하는 방식을 쓰는데 이게 parametric search 인 것 같다.
코드의 count 어쩌구는 문제 조건을 참조.
솔직히 꼼수 같다. 그래도 정답만 찾으면 그만이니..
import sys
sys.stdin = open("sample_input.txt", "r")
# https://ggodong.tistory.com/90
# https://herong.tistory.com/entry/SWEA-3813-%EA%B7%B8%EB%9E%98%EB%8F%84-%EC%88%98%EB%AA%85%EC%9D%B4-%EC%A0%88%EB%B0%98%EC%9D%B4-%EB%90%98%EC%96%B4%EC%84%9C%EB%8A%94
def isAvailable(p):
now = 1
cont = 0
for i in range(1,lenS+1):
# print("i,now,cont,p,S[i]",i,now,cont,p,S[i])
if S[i] <= p:
cont += 1
else:
cont = 0
if cont == K[now]:
cont = 0
now += 1
if now > lenK:
break
return now > lenK
T = int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
# ///////////////////////////////////////////////////////////////////////////////////
lenS,lenK = map(int, input().split())
S = list(map(int, input().split()))
K = list(map(int, input().split()))
S.insert(0,0)
K.insert(0, 0)
print(S,K)
s = min(S)
e = max(S)
while s<e:
m = (s+e) // 2
print("s,m,e",s,m,e)
if (isAvailable(m)):
e = m
else:
s = m + 1
print(s)
print("#{}".format(test_case),s)
# ///////////////////////////////////////////////////////////////////////////////////

댓글 없음:
댓글 쓰기