문제 : 공을 장애물을 건너 이동하는 거리
1. 공의 반지름이 벽의 높이보다 클경우
2. 공의 반지름이 벽의 높이보다 작을 경우
따로따로 계산해주면 되는 과정
입력 | 출력 |
1 ≤ T(테스트 개수) ≤ 150 1 ≤ R(반지름) ≤ 100 1 ≤ S(시작)≤ 1000 1 ≤ S ≤ E(끝)≤ 1000000 1 ≤ N(장애물)≤ 1000 1 ≤ h(장애물높이)≤ 1000
|
시작 부터 끝까지 공의 총 이동거리
|
JAVA
언어 | 결과 | 수행시간 | 메모리 | 점수 |
Java | Pass | 0.12309 | 189920 | 150 |
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Solution {
public static void main(String args[]) throws IOException {
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t,i,j,r,n,x1,x2,wr;
double ans=0;
int s=0,e=0;
t = Integer.parseInt(br.readLine());
for(i=1;i<=t;i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
r = Integer.parseInt(st.nextToken());
s = Integer.parseInt(st.nextToken());
e = Integer.parseInt(st.nextToken());
n = Integer.parseInt(br.readLine());
ans = 0;
for(j=0;j<n;j++) {
st = new StringTokenizer(br.readLine());
x1 = Integer.parseInt(st.nextToken());
x2 = Integer.parseInt(st.nextToken());
wr = Integer.parseInt(st.nextToken());
//장애물 왼쪽
if(x1>s&&x1<e) {//시작과 끝사이에 있는지 확인
if(wr>=r) {//높이가 반지름보다 크거나 같으면
ans+=(wr-2*r)+Math.PI*r/2; //공을타고 올라가 90도만큼 돌려준다 이때 원래 이동해야하는 거리를 뺀다
}else {
ans += r*(Math.acos((double)(r-wr)/r)-Math.sin(Math.acos((double)(r-wr)/r))); //공과 벽이 이루는 각도만큼 회전후 원래 이동해야 하는 거리를 뺀다.
}
}
//장애물 오른쪽
if(x2>s&&x2<e) {//시작과 끝사이에 있는지 확인
if(wr>=r) {높이가 반지름보다 크거나 같으면
ans+=(wr-2*r)+Math.PI*r/2;
}else {
ans += r*(Math.acos((double)(r-wr)/r)-Math.sin(Math.acos((double)(r-wr)/r)));
}
}
}
sb.append("Case #"+i+"\n"+(ans+e-s)+"\n");
}
System.out.println(sb.toString());
br.close();
}
}
'Codeground' 카테고리의 다른 글
[Codeground] SCPC 5회 예선 : 오르락 내리락 (0) | 2019.12.08 |
---|