16085번 Гэмт хэрэг
문제
번역
형사가 용의자가 있을 수 있는 지역의 넓이를 계산하는 문제.
정보가 들어온지 T초가 지났다.
차량은 오직 도로 위로만 이동하며 도로는 단 하나 존재한다.(x축)
도보로는 도로를 벗어날 수 있다.(y축)
도보로는 초당 W미터, 차를 타면 초당 C 미터 이동 가능하다.
탑승, 하차 시간은 계산하지 않음.
설계
단순히 원형, 캡슐형을 생각해서 계산하니 예제에 맞지 않는다.
우선 분기해야하는 부분이 C와 W 속도 차이.
차량보다 도보가 빠르면 차량을 탈 이유가 없다.
따라서 W가 C보다 크거나 같을 경우 도보로 가능한 원의 너비를 계산하면 끝.
C가 W보다 큰게 문제인데
우선 도로를 타고 차량을 타고 이동한다.
거기서 내린 뒤 남은 시간동안 도보로 이동할 수 있다.
도보로 이동하는 거리는 차량을 쓰는 만큼 줄어든다.
0 <= x <= T * C 만큼 차를 타고 이동하면 남은 시간은 T - x / C 이며
보행반경이 W * (T - x / C) 만큼 줄어든다.
순수 도보로 그려지는 원의 경계가 더 큰 동안 원의 경계를 따르고
이후 차량->도보로 그려지는 선형구간의 넓이를 추가한다.
도보 원의 세그먼트 면적과 차량->도보로 이어지는 선형구간을 합하고 양쪽으로 갈 수 있으니 2를 곱해서 나오는 공식은
2 * T^2 * (W^2 * arcsin(W/C) + W * sqrt(C^2 - W^2))
아 머리아파
구현
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
int main() {
int n;
cin >> n;
while (n--) {
double T, W, C;
cin >> T >> W >> C;
double result;
if (C <= W) {
// 도보가 빠르면 원 면적 계산
// (W*T)^2 * π
result = W * W * T * T * M_PI;
} else {
// 차량이 빠르면 공식에 대입
// 2 * T^2 * (W^2 * arcsin(W/C) + W * sqrt(C^2 - W^2))
double term1 = W * W * asin(W / C); // W^2 * arcsin(W/C)
double term2 = W * sqrt(C * C - W * W); // W * sqrt(C^2 - W^2)
result = 2.0 * T * T * (term1 + term2);
}
// 소수점 셋째 자리까지 출력
printf("%.3f\n", result);
}
return 0;
}
채점
반성
이딴게 왜 골드? 하고 접근했다가
예제 다틀려서 상당히 당황했다.
세상만사 다 이유가 있지…
코드 확인