문제 : 공을 장애물을 건너 이동하는 거리

 

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

+ Recent posts