반응형
문제
https://www.acmicpc.net/problem/2805
M의 나무를 가져가야 할때 최악의 상황에서 최대길이에 M만큼을 뺀 길이만큼
절단해야 한다.(높이는 최소)이값과 최대길이의 값의 중간값을 기준으로 이분탐색을
시행해 준다.
코드로 구현해보자
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import sys N,M=map(int,sys.stdin.readline().split()) tree=list(map(int,sys.stdin.readline().split())) max_cut=max(tree) min_cut=max_cut-M#나무를 가장 많이 자를때 result=0 while min_cut<=max_cut: mid = (max_cut + min_cut) // 2 sum_tree=0 for i in tree: if i>mid: sum_tree+=i-mid if sum_tree>=M:#원하는 목재보다 많이 나왓으면 높이를 늘림 result = mid min_cut=mid+1 else:#원하는 목재보다 작게 나온다면 높이를 줄임 max_cut=mid-1 print(result) | cs |
시간초과가 뜬다.
pypy3로 제출했을때는 성공이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import sys N,M=map(int,sys.stdin.readline().split()) tree=list(map(int,sys.stdin.readline().split())) tree.sort(reverse=True)#내림차순정렬 max_cut=tree[0] min_cut=max_cut-M#나무를 가장 많이 자를때 result=0 while min_cut<=max_cut: mid = (max_cut + min_cut) // 2 sum_tree=0 for i in tree: if i>mid: sum_tree+=i-mid else: break if sum_tree>=M:#원하는 목재보다 많이 나왓으면 높이를 늘림 result = mid min_cut = mid + 1 else:#원하는 목재보다 작게 나온다면 높이를 줄임 max_cut=mid-1 print(result) | cs |
최대한 줄인다고 줄여봤지만 역시 시간초과이다.
아래는 성공한 코드인데 무슨 차이인지 모르겠다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | N,M = map(int,input().split()) tree=list(map(int,input().split())) def treesum(height): Sum=0 for i in tree: if i-height > 0: Sum+=(i-height) return Sum def binaray(target): start,end=0, max(tree) result =0 while(start <=end): mid = (start + end) // 2 Sum = treesum(mid) if Sum < target : end = mid -1 elif Sum >= target: result = mid start = mid+1 return result print(binaray(M)) | cs |
어떤부분에서 차이점을 만드는지 알려주신다면 감사하겠습니다.
반응형
'알고리즘(python) > 탐색' 카테고리의 다른 글
[Python]이분탐색 백준 1300 (2) | 2020.02.01 |
---|---|
[Python]이분탐색 백준 2110 (0) | 2020.02.01 |
[Python]이분탐색 백준 1654 (0) | 2020.01.31 |
[Python]이분탐색 백준 10816 (0) | 2020.01.31 |
[Python]이분탐색 백준 1920 (0) | 2020.01.31 |
최근댓글