https://www.acmicpc.net/problem/9553
- 처음에 확률이라길래 타겟과 양 끝 지점들을 그래프 위에 전부 그린 후 시계 방향으로 순회하며 각 지역별 각도와 맞춘 개수를 직접 구해 곱해주려고 했다.
- 그러나 훨씬 좋은 방법은, 전체 기댓값은 타겟 각각의 기댓값의 선형 결합으로 구할 수 있다는 것이다.
- 타겟의 두 지점이 주어지면 타겟의 각도를 구하고, 전체 각도인 360도(2 * pi)로 나눠주면 개별 확률이 된다.
- 다만 문제에서 타겟이 원점을 지나지 않는다는 조건을 똑바로 읽지 못해 반례를 찾는데 오래 걸렸다. ( 2 0 1 0 )
- 각도는 arcsin 을 활용해서도 구할 수 있고, 벡터의 내적을 이용한 arccos 를 이용할 수도 있다.
import math
def probability(x1, y1, x2, y2):
return (math.acos((x1*x2+y1*y2)/math.sqrt((x1**2+y1**2)*(x2**2+y2**2)))) / (2*math.pi) # 그 외는 전체 각도 360도 중에서 선분이 차지하는 각도의 비율이 확률
for tc in range(int(input())): # 각 테스트케이스 별로 N 개 선분들이 갖는 확률들의 합 포매팅해서 출력
print(f"{round(sum([probability(*list(map(int, input().split()))) for i in range(int(input()))]), 5):.5f}")
'PS > BOJ' 카테고리의 다른 글
[백준] 1197 : 최소 스패닝 트리 (0) | 2021.07.02 |
---|---|
[백준] 21772 : 가희의 고구마 먹방 (0) | 2021.07.01 |
[백준] 4172 : sqrt log sin (0) | 2021.06.29 |
[백준] 17829 : 222-풀링 (0) | 2021.06.28 |
[백준] 20040 : 사이클 게임 (0) | 2021.06.27 |