※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 26654번 문제인 원점이다.
문제는 아래 링크를 확인하자.

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

 

정다각형의 각 꼭짓점 또한 원 하나의 원주(원의 둘레) 위에 전부 올릴 수 있음을 생각하면 문제를 쉽게 접근할 수 있다.

 

정다각형의 외접원의 반지름보다 반지름이 큰 원은 정다각형의 모든 꼭짓점을 포함할 수 있다. 그렇지 않을 경우 원은 정다각형의 외접원의 원주의 절반 이상을 덮을 수 없으므로 많아야 \(N/2\)개의 꼭짓점만을 포함할 수 있다.

 

정다각형의 외접원의 반지름을 먼저 계산하고(사인 법칙 등 구할 방법은 많으니 편한 방법을 선택하자), 위의 관찰을 이용해 몇 개의 꼭짓점을 포함할 수 있는지 이분탐색을 이용해 구해 문제를 해결하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <cmath>
using namespace std;
typedef long double ld;

const ld PI = acosl(-1);
int N, A, B;
ld R1, R2, theta;
ld X, Y;

void solve() {
	cin >> N >> A >> B;
	theta = PI * 2 / N;
	R1 = sqrtl((ld)A * 2 / (N * sinl(theta)));
	R2 = sqrtl((ld)B / PI);

	if (R1 <= R2) {
		cout << N << '\n';
		return;
	}

	X = cosl(theta), Y = sinl(theta);
	if (hypotl(1 - X, Y) * R1 > R2 * 2) {
		cout << 1 << '\n';
		return;
	}
	int L = 1, R = N / 2;
	while (L < R) {
		int mid = (L + R) / 2 + 1;
		X = cosl(theta * mid), Y = sinl(theta * mid);
		if (hypotl(1 - X, Y) * R1 > R2 * 2) {
			R = mid - 1;
		}
		else L = mid;
	}
	cout << L + 1 << '\n';
}

int T;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> T;
	while (T--) solve();
}

 

BOJ Random Defense #17

728x90

'BOJ' 카테고리의 다른 글

[BOJ 21278 // C++] 호석이 두 마리 치킨  (0) 2024.06.05
[BOJ 2632 // C++] 피자판매  (0) 2024.06.04
[BOJ 1635 // C++] 1 또는 -1  (0) 2024.06.02
[BOJ 23000 // C++] L Shaped Plots  (0) 2024.06.01
[BOJ 9911 // C++] ERP  (0) 2024.05.31

+ Recent posts