https://www.acmicpc.net/problem/9553

 

9553번: 양궁

각 테스트 케이스마다 화살 한 발로 맞힐 수 있는 타겟 수의 기댓값을 소수점 여섯 번째 자리에서 반올림하여 다섯 번째 자리까지 출력한다.

www.acmicpc.net


  • 처음에 확률이라길래 타겟과 양 끝 지점들을 그래프 위에 전부 그린 후 시계 방향으로 순회하며 각 지역별 각도와 맞춘 개수를 직접 구해 곱해주려고 했다.
  • 그러나 훨씬 좋은 방법은, 전체 기댓값은 타겟 각각의 기댓값의 선형 결합으로 구할 수 있다는 것이다.
  • 타겟의 두 지점이 주어지면 타겟의 각도를 구하고, 전체 각도인 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

+ Recent posts