솔브드의 랜덤 마라톤이 베타를 종료하고 나서 처음으로 마라톤을 완주해 봤습니다.
앞으로도 랜덤 마라톤 풀이를 지속적으로 올릴 생각입니다.
한번 문제를 풀어봅시다.
A. 가지 한 두름 주세요
단순한 구현 문제입니다.
1 |
|
B. 귀찮아 (SIB)
문제에서 구해야 하는 것은 아래와 같습니다.
\[\sum_{1 \leq a < b \leq n} x_ax_b = \sum_{b = 2}^n\sum_{a = 1}^{b-1} x_a\]누적합을 전처리 해 두면 $\sum\limits_{a = 1}^{b-1} x_a$를 $O(1)$에 구할 수 있습니다. 따라서 전체 시간복잡도는 $O(N)$ 입니다.
1 |
|
C. 차집합
단순한 집합 + 정렬 문제입니다.
집합 $A$에서 집합 $B$에 속하는 원소들을 모두 제거한 뒤, 남은 원소들을 정렬하여 출력하면 됩니다.
C++의 std::set을 쓰면 직접 정렬하지 않아도 됩니다.
1 |
|
D. 별 찍기 - 19
구현 문제입니다.
저는 사각형을 2칸씩 좁혀가면서 반복문으로 풀었습니다.
재귀로 구현해도 되고, 중심으로부터 떨어진 거리를 이용해 풀어도 됩니다.
1 |
|
E. 바지 구매
문제에서 주어진 그래프는 시루가 오른쪽으로 엎드려 있는 그림입니다.
시루의 하체와 딱 맞도록 바지를 입었을 때, 바지의 끝부분이 지면과 일치해야 하므로 $u = f(v)$여야 함을 알 수 있습니다.
1 |
|
F. 황소 다마고치
황소의 현제 체력을 $h$라 하면 생존 가능 일수는 $\log_2 h$입니다.
먹이를 주어 $\log_2$의 값을 올려 주면 생존 가능 일수를 1 늘려줄 수 있습니다.
$h \neq 1$이면 $\log_2$ 값을 올리기 위한 먹이의 개수가 $1$ 이상입니다.
따라서 $h = 1$일 때 먹이를 하나씩 주면서 하루 하루 연명하는 것이 최선의 방법입니다.
엄밀하게 증명해 보겠습니다. 그러니까 먹이를 $m$개 주었을 때 $m$일 보다 많이 더 버틸 수 있는 경우가 없음을 증명하겠습니다.
식으로 쓰면 $\log_2 (h + m) \leq \log_2 h + m$입니다.
$m = 1$일 때 자명하게 성립합니다.
$m = k$일때 성립한다고 합시다. 그렇다면 $1 + \dfrac{k}{h} \leq 2^k$ 입니다.
양변에 $2$를 곱하면 $2 + \dfrac{2k}{h} \leq 2^{k+1}$ 입니다.
여기서 $1 + \dfrac{k + 1}{h} \leq 2 + \dfrac{2k}{h}$ 이므로
$1 + \dfrac{k + 1}{h} \leq 2 + \dfrac{2k}{h} \leq 2^{k+1}$
따라서 성립합니다.
1 |
|
G. 너의 티어는?
단순한 DP 문제입니다.
$p[i][j]$를 랭크전을 $j$판 하여 점수가 $i$일 확률이라고 합시다.
$p$는 아래의 점화식으로 구할 수 있습니다.
코드에서는 $p[i][j]$를 한번에 구하는 방식이 아니라 따로 더하는 방식으로 구했습니다.
1 |
|
H. 가장 큰 값
단순 브루트 포스 문제입니다. 붙어 있는 수도 다른 그룹으로 생각할 수 있음에 유의합니다.
1 |
|