2018. 1. 5. 23:38, 알고리즘/BOJ
https://www.acmicpc.net/problem/14488
N=50000명의 학생이 시간 T 안에 전부 만날 수 있나를 확인해야하는데, 2중 for문을 돌면서 두 학생이 만나는 시간(= abs(x[i]-x[j]) / (v[i]+v[j]))이 T보다 큰지를 확인한다면 답을 알 수는 있지만 시간초과가 발생합니다.
대신 관점을 달리하여 각 학생이 시간 T 안에 도달할 수 있는 영역을 저장해두고 이를 갱신하면서 각 학생에 대해 영역과 겹치는 부분이 있는지를 확인하면 됩니다. 이러면 O(N)으로 풀 수 있습니다.
그런데 문제가 있는데, T를 실수로 저장하면 실수 오차 때문에 답이 틀릴 수 있습니다.(이 실수오차로 인해 재채점에서 나가리됐습니다.) 이를 방지하려고 T를 10000배해서 들고있으면 long long 범위를 넘어갈 수 있습니다.
C나 C++로 구현을 하려고 한다면 Big Integer를 처리할 수 있는 구조체를 만들어서 풀어야하고, 사실 그보다는 python으로 푸는 것이 깔끔합니다.
'알고리즘 > BOJ' 카테고리의 다른 글
[BOJ] 11504번: 가장 긴 바이토닉 부분 수열 (0) | 2018.01.05 |
---|---|
[BOJ] 1983번: 숫자 박스 (0) | 2018.01.05 |
[BOJ] 1764번: 듣보잡 (0) | 2018.01.05 |
[BOJ] 10974번: 모든 순열 (0) | 2018.01.05 |
[BOJ] 1504번: 특정한 최단 경로 (0) | 2018.01.05 |
[BOJ] 11404번: 플로이드 (0) | 2018.01.05 |
Comments