ps:problems:boj:3079
입국심사
ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 3079 |
문제명 | 입국심사 |
레벨 | 실버 1 |
분류 |
파라메트릭 서치 |
시간복잡도 | O(nlog(km/n)) |
인풋사이즈 | n<=10^5, m<=10^9, k<=10^9 |
사용한 언어 | Python |
제출기록 | 37392KB / 888ms |
최고기록 | 476ms |
해결날짜 | 2021/06/29 |
풀이
- 프로그래머즈의 입국심사과 동일한 문제이다.
- 동일한 이유는 둘다 동일한 COCI 문제를 번역한 것이기 때문이다. 입국심사대에 10억명이 몰리는 원본 문제 자체도 이미 비현실적이긴 하지만, BOJ번역에서는 친구가 10억명이 있고, 모두 비행기 한 대에 타고서 놀러간다는 설정이 되어버렸다.
- 풀이는 파라메트릭 서치를 통해서 풀면 된다. 주어진 T시간 동안 심사를 받을수 있는 사람의 수가 M 이상인지 계산하는 함수를 만들고, 그 함수가 true가 되는 T의 최솟값을 찾으면 된다. 주어진 T시간 동안 심사를 받을 수 있는 사람의 수는 각 심사관이 T시간동안 몇명을 심사할수 있는지 계산해서 더하면 되므로 O(n).
- T값의 탐색 범위의 상한은 가능한 최댓값보다 크도록 적당히 잡아주면 되는데, 이럴때 내가 주로 쓰는 방법은, '가장 빠른 심사관 한명이서 모든 사람을 심사하는 경우의 시간 = min(T)*M' 또는 '모든 심사관이 동일한 수의 사람을 심사하는 경우의 시간 = max(T)*ceil(M/N)' 이다. 더 타이트한 바운드를 잡으면 그게 물론 좋기야 하지만, 어차피 로그 안에 들어가는 텀이라서 영향이 그렇게 크지는 않다. 그러면 그냥 심플한 값을 찾는 것이 낫다.
- 바운드를 max(T)*ceil(M/N) = O(km/n) 으로 잡으면 총 시간복잡도는 O(nlog(km/n)).
코드
"""Solution code for "BOJ 3079. 입국심사".
- Problem link: https://www.acmicpc.net/problem/3079
- Solution link: http://www.teferi.net/ps/problems/boj/3079
Tags: [Binary search]
"""
import sys
from teflib import algorithm
def main():
def is_possible(total_time):
checkable_passenger_count = sum(total_time // t_k for t_k in T)
return checkable_passenger_count >= M
N, M = [int(x) for x in sys.stdin.readline().split()]
T = [int(sys.stdin.readline()) for _ in range(N)]
print(algorithm.binary_search(0, min(T) * N, is_possible))
if __name__ == '__main__':
main()
- Dependency: teflib.algorithm.binary_search
ps/problems/boj/3079.txt · 마지막으로 수정됨: 2021/06/29 02:03 저자 teferi
토론