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

 

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

문제 : 다음 규칙에 따라 숫자를 1로 만드는 게임이다.

 

1. 수가 1이라면 종료

2. 1번 이후 홀수라면 1을 더한다.

3. 2번 이후 짝수라면 2로 나누고 처음으로 돌아간다.

 

입력 출력

1 ≤ T(테스트 개수) ≤ 10000

1 ≤ N1 ≤ N2 ≤ 1000000

N1부터 N2까지 각각 필요한 횟수의 총합

 

 

 

JAVA

언어 결과 수행시간 메모리

점수

Java Pass 0.12642 208304

100

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Solution {

	static int[] list = new int[1000001]; //개별횟수
	static int[] slist = new int[1000001]; //구간합
	static int a,b;
	static StringBuilder sb = new StringBuilder();
	
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int n,i;
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st.nextToken());//테스트 개수
		list[2] = 1;
		for(i=2;i<=1000000;i++) {//2~1000000 까지 구간합 미리 계산
			slist[i]=slist[i-1]+make1(i);
		}
		for(i=1;i<=n;i++) {
			st = new StringTokenizer(br.readLine());
			a = Integer.parseInt(st.nextToken());//N1
			b = Integer.parseInt(st.nextToken());//N2
			sb.append("Case #"+i+"\n"+(slist[b]-slist[a-1])+"\n");
		}
		System.out.println(sb.toString()); //출력
		br.close();
	}
	static int make1(int k) {
		if(list[k]!=0) {//이미 저장된 값이라면 출력후 리턴
			return list[k];
		}else if(k%2==0) {
			return list[k] = 1 + make1(k>>1); // 짝수라면 2로 나눈다
		}else {
			return list[k] = 1 + make1(k+1); // 홀수라면 1을 더한다
		}
	}
}

 

'Codeground' 카테고리의 다른 글

[Codeground] SCPC 5회 예선 : 공 굴리기  (0) 2019.12.09

+ Recent posts