사용자 도구

사이트 도구


ps:problems:boj:2180

소방서의 고민

ps
링크acmicpc.net/…
출처BOJ
문제 번호2180
문제명소방서의 고민
레벨플래티넘 5
분류

그리디

시간복잡도O(nlogn)
인풋사이즈n<=200,000
사용한 언어Python 3.11
제출기록74248KB / 456ms
최고기록456ms
해결날짜2023/05/24

풀이

  • Exchange arguments를 통해 그리디한 풀이를 도출해낼수 있다.
  • 현재 시간이 t0일때,
    • i번→j번 순서로 고르고 나면 시간은 (t0*a_i+b_i)*a_j + b_j
    • j번→i번 순서로 고르고 나면 시간은 (t0*a_j+b_j)*a_i + b_i
  • (t0*a_i+b_i)*a_j + b_j < (t0*a_i+b_i)*a_j + b_j 이면 i번→j번 순서대로 골라야 한다.
  • 식을 정리하면 b_i/a_i < b_j/a_j 이므로, (b_i/a_i) 기준으로 정렬한 뒤 그 순서대로 처리해주면 된다.
    • a_i가 0인 경우에 대한 예외처리만 잘 해주면 된다. a_i가 0일때는 맨 마지막에 선택하면 된다.
  • 시간복잡도는 정렬에 드는 O(nlogn)에 바운드된다.

코드

"""Solution code for "BOJ 2180. 소방서의 고민".

- Problem link: https://www.acmicpc.net/problem/2180
- Solution link: http://www.teferi.net/ps/problems/boj/2180

Tags: [greedy]
"""

import sys

INF = float('inf')
MOD = 40000


def main():
    n = int(sys.stdin.readline())
    a_and_b = [[int(x) for x in sys.stdin.readline().split()] for _ in range(n)]

    a_and_b.sort(key=lambda x: INF if x[0] == 0 else x[1] / x[0])
    t = 0
    for a, b in a_and_b:
        t = (t + a * t + b) % MOD

    print(t)


if __name__ == '__main__':
    main()

토론

댓글을 입력하세요:
P K P᠎ Q I
 
ps/problems/boj/2180.txt · 마지막으로 수정됨: 2023/05/24 06:54 저자 teferi