※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 25993번 문제인 Bellevue이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/25993
한 방향으로의 시야각 최댓값을 찾을 때 주어지는 꺾이는 점만을 이용해 판단해도 충분함을 관찰하자. 해안가와 해당 점을 잇는 직선을 해안가를 원점으로 하는 직선들로 생각하면 이를 쉽게 이해할 수 있을 것이다.
왼쪽으로의 시야각과 오른쪽으로의 시야각의 최댓값 중 더 큰 값을 찾자.
글쓴이는 tanl값을 좌표를 이용해 계산 후 atan2l함수를 이용해 각도로 변환하여 문제를 해결하였다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <cmath>
using namespace std;
typedef long double ld;
const ld PI = acosl(-1);
int N;
int P[50000][2];
ld X, Y;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N;
for (int i = 0; i < N; i++) cin >> P[i][0] >> P[i][1];
for (int k = 1; k + 1 < N; k++) {
int dx = P[k][0] - P[0][0], dy = P[k][1];
X = max(X, atan2l(dy, dx));
dx = P[N - 1][0] - P[k][0];
Y = max(Y, atan2l(dy, dx));
}
cout << fixed;
cout.precision(10);
cout << max(X, Y) * 180 / PI;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 7804 // C++] Taxi! (3) | 2024.09.04 |
---|---|
[BOJ 14265 // C++] 영선 수열 (3) | 2024.09.03 |
[BOJ 23930 // C++] Parcels (6) | 2024.09.01 |
[BOJ 10349 // C++] Wet Tiles (1) | 2024.08.31 |
[BOJ 10425 // C++] 피보나치 인버스 (1) | 2024.08.30 |