프로그래밍 연습장

180519 동아리 연습 문제 풀이 본문

문제 해결

180519 동아리 연습 문제 풀이

김준원 2018. 5. 19. 11:35


난이도: 중등부 2번, 분류: DP


dp[x][y] 다음과 같이 정의하자.

 

dp[x][y] = 시간 x까지 y번만 이동해서 자두를 받아먹었을 최대로 받아먹을 있는 개수

 

이동한 횟수만으로 현재의 위치를 얻어낼 있다. 짝수 이동했으면 1, 홀수 이동했으면 2 위치에 있을 것이다. 현재 위치를 pos라고 하자. 이렇게 정의하고 나면, 다음과 같은 점화식을 세울 있다.

 

dp[x][y]=max

 

값들을 모두 계산한 , y=0..k까지에 대해 dp[n-1][y] 최댓값을 구하면 된다.


B. 수열의

 

난이도: 중등부 1번, 분류: 수학, 아이디어


다양한 풀이가 있을 있다. 이들 가운데 가지를 소개한다.

 

풀이 1. 주어진 수들을 모두 합치면 "전체 원소들의 " 2(n-1)배가 된다. , i번째 행의 모든 수들의 합은 원소들의 + A_i \times (n-2) 된다. 이를 이용해서, 전체 원소들의 S 구하면, A_i i번째 행의 원소들의 합에서 S 빼고, n-2 나누면 된다.

 

풀이 2. 1번째 행에서, A_3 \cdots A_n에서 A_1 더한 수치를 있다. 2번째 행에서, A_3 \cdots A_n에서 A_2 더한 수치를 있다. 1 2열의 값은 A_1 + A_2이므로, 행의 3 \cdots n번째 원소를 더한 , A_1 + A_2 나누고 절반을 하면 A_3 \cdots A_n 구할 있다. 이로부터 A_1, A_2 쉽게 구할 있을 것이다.

 

가지 참고할 있는 것은, 문제에서 2 \leq n이라고 되어 있지만, 조건을 만족하는 수열이 유일함에서 n=2 경우는 [1, 1]만이 가능하다. 특히 풀이 2 경우에는 n=2 경우가 예외 처리가 필요할 수도 있고, 이는 적절히 고려해 주도록 하자.

 

C. 랜선 자르기

 

난이도: 중등부 2번, 분류: 이진탐색


역으로, 길이가 L 랜선을 최대로 많이 만들어야 한다고 보자. , 최대로 만들 있는 개수는 모든 주어진 간선의 길이를 L 나눈 몫의 합이다. 이제, f(L) := 만들 있는 길이가 L 랜선의 최대 개수 정의하자. f(L) 감소함수가 되고, f(L) N 이상이 되는 최대의 L 구하면 된다.

 

이는 이진 탐색으로 쉽게 해결하고, 다음과 같은 기본적인 로직을 사용하면 것이다.

 

L <- 작은 , R <-

While L+1 < R:

M = (L+R)/2

If (f(M) >= N): L = M

Else: R = M

 

코드는 f(L) >= N, f(R) < N 불변 조건을 항상 만족하고, 따라서 답은 L 된다.

 

D. 고속도로

 

난이도: 고등부 1번, 분류: DP



일단, 들어온 나들목의 번호 목록 in 나간 나들목의 번호 목록 out 정렬해 두자. "들어올 사용한 나들목과 나갈 사용하는 나들목이 달라야 한다"라는 조건만 없다면 모든 i 대해 in[i]에서 out[i] 나가는 것이 최적해일 것이다. 하지만 조건 때문에 고려할 것이 생긴다. 증명은 생략하지만, 최적의 방법은 다음 가지 하나이다.

 

  1. in[x] \rightarrow out[x]
  2. in[x] \rightarrow out[x+1], in[x+1] \rightarrow out[x]
  3. in[x] \rightarrow out[x+1], in[x+1] \rightarrow out[x+2], in[x+2] \rightarrow out[x]
  4. in[x] \rightarrow out[x+2], in[x+1] \rightarrow out[x], in[x+2] \rightarrow out[x+1]

 

말로 풀어 말하면, 많아야 개의 번호 이내에서 순서를 섞으면 해결된다는 것이다. 이는 dp[x] in[x] out[x]까지 처리한 최적해라고 정의했을 때에, 개의 경우를 계산해 주면서 해결할 있다.

 

E. Hotels

 

난이도: 고등부 2번, 분류: 트리, 조합


호텔 A, B, C 개를 지었을 때에 A에서 B, C 가는 경로를 생각해 보자. 경로는 A에서 출발한 개의 "공통된 간선" 따라 이동할 것이고, 어떤 "갈림길" 있어서 B C 도달할 것이다. "갈림길"이 시작하 정점을 생각해 보면, 정점에서 A, B, C 이르는 거리는 같아야 한다. 이런 정점 P 무조건 존재하고, 호텔 배치에 대해 유일하다.

 

N 제한이 그닥 크지 않으므로, N개의 정점에 대해 정점이 P 경우에 경로를 주면 된다. 정점 P 루트로 해서 트리를 세웠을 때에, 서브트리에 "P와의 거리가 1, 2, …, N-1 정점의 개수" 기록해 두면, 간단한 조합으로 "P 서로 다른 서브트리에 속하면서 거리가 같은 정점들의 개수" 구할 있다. 예를 들어, 서브트리에 대해 거리가 k 정점의 개수가 a_1 , …, a_r개라고 하자. 그러면, 구하는 개수는 수열에서 서로 다른 개의 원소의 곱을 모두 합한 값이 된다. 이렇게 고른 정점 A, B, C 각각 P와의 거리가 k 되고, 서로 간의 거리는 2k 된다.


'문제 해결' 카테고리의 다른 글

ICPC Yokohama Regional 2018  (2) 2020.07.20
190720 팀 연습: BAPC 2018  (2) 2019.07.21
180428 동아리 연습 문제 풀이  (1) 2018.04.28
180421 동아리 연습 문제 풀이  (1) 2018.04.21
180324 동아리 연습 문제 풀이  (0) 2018.03.24
Comments