티스토리 뷰
C. Ceiling Function
K개의 노드로 구성된 Binary Search Tree가 N개 주어진다. 이 때 서로 다른 모양을 갖는 BST의 개수를 구하는 문제다.
구조체를 써서 BST를 구현하고 두 노드에 대해 각 노드를 루트로한 서브트리가 같은지 비교해주는 재귀 함수를 구현하여 쉽게 해결할 수 있다.
E. Forever Young
수 Y를 b 진법으로 나타냈을 때, 0부터 9 사이의 수로 이루어져야하고, 그 수를 10진수처럼 읽었을 때 L이상이어야 한다. 이 때 가능한 b 중 최대값을 구하는 문제다.
우선 b가 충분히 큰 수인 경우, b진법의 자리수가 적을 것이다. 자리수가 5 이하인 경우, b진법으로 나타냈을 때 수를 정해놓고 이분탐색을 통해 해당 b를 계산하는 방법으로 해결할 수 있다. 만약 b<1018/4≤31,623으로 충분히 작은 경우에 대해서는 직접 b를 정해놓고 확인할 수 있다. b≥10 이므로 문자열을 통한 대소비교를 할 필요가 없다.
L. Swap Space
N개의 디스크가 있다. 각 디스크에 대해 포맷 전에 포함하는 데이터 용량은 a이며, 포맷 후 디스크의 용량은 b이다. 각 디스크는 포맷 전에 포함되어있는 데이터를 다른 곳으로 옮겨 백업해야한다. 이 때, 모든 디스크를 포맷하기 위해 마련해야하는 추가 공간의 최소 용량을 구하는 문제다.
디스크를 두 종류를 나눠 생각할 수 있다.
a≤b 인 경우에 대해 먼저 생각하자. a가 작은 순서로 정렬한 뒤에 순서대로 처리한다. 남은 공간이 a보다 적으면 추가 공간을 새로 구입하고 아니면 그 공간에 데이터를 백업하고 포맷하는 방식으로 처리한다. 이 때 디스크를 포맷할 때마다 b−a 만큼 총 공간이 증가하므로 최적이다.
이제 a>b 인 경우에 대해 해결하면 된다. 포맷을 다 마친 최종 상태에서 거꾸로 생각해보자. 마지막 포맷을 번복하면 a−b 만큼 총 공간이 증가하는 꼴이 될 것이다. 이 때 추가 공간을 최소로 구입하기 위해서는 b가 작은 것을 뒤에 포맷하면 된다. a≤b 인 경우와 비슷하게 포맷을 b의 역순으로 해주면 이 때도 최적이다.
G. Oil
서로 만나지 않는 수평 선분 N개가 있다. 수평이 아닌 직선을 그어 직선이 지나는 수평 선분 길이 합의 최대값을 구하는 문제다.
답이 되는 직선이 있다고 하자. 이 직선이 지나는 선분들이 유지되도록 적절히 좌우로 움직이면 어떤 선분의 끝 점에 걸치도록 할 수 있다. 즉, 답이 되는 직선 중 하나는 어떤 선분의 끝 점을 지난다.
이 특성을 이용해서 선분의 끝 점 중 하나를 정한다. 그리고 이 점을 지나는 직선 중 지나는 수평 선분 길이 합이 최대가 되는 직선을 구한다. 이 때 직선을 180도 돌리는 것 처럼 보이지만, 아래 부분에 해당하는 선분들을 점대칭 시켜서 윗부분으로 옮기면 반직선을 180도 돌리는 것처럼 되어 쉽게 해결할 수 있다. 이 문제는 결국 구간들이 주어지고 지나는 구간 길이 합이 제일 큰 수직선을 구하는 문제와 같게 된다.
K. String Theory
작은 따옴표(')가 들어있는 문자열 중에 특정 문자열을 k-quotation이라고 정의한다. 문제에서 문자열에서 연속된 작은 따옴표 수들이 수열로 주어질 때, 문자열이 k-quotation인 경우 가장 큰 k를 구하는 문제다.
k-quotation의 특징은 양 옆에 k개의 연속된 작은 따옴표와 그 사이에 (k-1)-quotation이 나열되어 있다는 것이다. 따라서 만약 문자열이 k-quotation이라면 작은 따옴표가 왼쪽에 연속해서 k개, k-1개, ..., 2개, 1개 그리고 오른쪽에 1개, 2개, ..., k-1개, k개 이런식으로 있어야한다. 이제 그 사이 있는 따옴표 배열에 따라 k-quotation인지 아닌지가 결정되는 것으로 생각할 수 있다. 하지만 아주 단순하게 그 사이에 있는 작은 따옴표의 개수가 짝수라면 이 문자열은 k-quotation이다. 왜냐하면 그 사이에 있는 모든 작은 따옴표를 모두 1-quotation으로 봐도 무방하기 때문이다. 만약 그 사이에 있는 작은 따옴표의 개수가 홀수라면 전체 따옴표의 개수가 홀수가 되기 때문에 k-quotation이 될 수 없다.
D. Clock Breaking
4개의 숫자를 표시하는 LED 시계가 있다. 어떤 부분은 항상 꺼져있고, 어떤 부분은 항상 켜져있고, 어떤 부분은 잘 동작한다. 어떤 시각부터 연속해서 n분 동안의 상태가 입력으로 주어졌을 때, 시계의 각 LED판의 상황을 구하는 문제다.
가능한 모든 시작시각에 대해 테스트를 해보고 판의 상황을 유추해보면되는 구현 문제다. 각 부분에 대해 상황을 비트로 표현하면 보다 쉽게 해결할 수 있다.
A. Balanced Diet
매 순간 다이어트 목적에 맞게 사탕을 먹을 때, 추가로 먹을 수 있는 사탕 개수의 최대값을 구하는 문제다.
무슨 사탕을 먹는 것이 제일 좋을까? 종류에 따라 너무 빨리 먹어서도 안되고 너무 늦게 먹어서도 안된다. 즉, 사탕 종류마다 먹을 수 있는/먹어야되는 순간이 정해지게 된다. 그러면 현재 먹을 수 있는 사탕 종류들이 있다. 현재 먹을 수 있는 사탕 종류들 중에 먹어야되는 순간이 제일 짧은 사탕 종류를 먼저 먹는 것이 항상 좋다. 문제에서 주어진 부등식을 통해 사탕 종류를 먹을 수 있게 되는 순간과 언제까지 먹어야되는지를 계산할 수 있다.
하지만 무한히 많은 사탕을 먹을 수 있는 경우도 존재한다. fi의 분모를 M이라고 하자. 추가적으로 M개의 사탕을 먹었다면, 그 것과 똑같은 순서로 M개의 사탕을 다시 먹어도 다이어트 조건을 만족한다. 그러므로 M개 이상의 사탕을 추가적으로 먹을 수 있다면, 무한히 많은 사탕을 먹을 수 있다는 것이다.
B. Branch Assignment
정점이 N개고 간선이 R개인 방향성 그래프가 주어진다. 1번 정점부터 B번 정점은 특별한 정점이고, 특별한 정점들을 S개의 그룹으로 나눠야한다. 그룹마다 비용을 정의할 수 있는데, 그룹의 비용은 그룹에 속해 있는 모든 정점 순서쌍 (i,j)들의 비용 합이다. 정점 순서쌍 (i,j)의 비용은 i번 정점에서 j번 정점으로 B+1번 정점을 거쳐가는 최단 거리다. B개의 특별한 정점을 S개의 그룹으로 나누고 그룹 비용의 합을 최소화하는 문제다.
특별한 i번 정점이 크기가 Ki인 그룹에 속해있다고 하자. i번 정점이 전체 비용에 미치는 영향은 (Ki−1)(dist(i,B+1)+dist(B+1,i)) 만큼인 것을 알 수 있다. 즉, i번 정점을 기준으로 볼 때 비용이 그룹의 크기에 영향을 받지 어떤 정점들과 함께 그룹에 있는지는 중요하지 않다는 것이다.
따라서 S개 그룹의 크기를 미리 정했다고 했을 때, Vi=dist(i,B+1)+dist(B+1,i) 값이 큰 정점이 작은 그룹에 들어가고, Vi 값이 작은 정점이 큰 그룹에 들어가는 것이 최적이다. 즉, Vi 순으로 특별한 정점을 정렬하고 일렬로 나타내었을 때, 같은 그룹에 속한 정점들은 연속되게 그룹을 나눠도 최적해를 구할 수 있다. 이 때 우리는 아래와 같은 DP배열을 정의할 수 있다.
D[c][i] = Vi 값 순으로 정렬해 일렬로 나타날 때, 때 첫 번째 정점부터 i번째 정점까지 그룹을 c개로 나누었을 때 최소 비용
D[c][i]=mink<i(D[c−1][k]+(i−k−1)(Vk+1+Vk+2+⋯+Vi)
DP 시간복잡도는 O(SB2)이지만, Divide & Conquer Optimization을 통해 O(SBlgB)로 줄일 수 있다. 이 경우 비용 함수 C[i][j]=(j−i−1)(Vi+1+Vi+2+⋯+Vj)가 사각부등식을 만족하기 때문에 Divide & Conquer Optimization을 이용할 수 있다.
'ICPC > World Finals' 카테고리의 다른 글
| ACM ICPC World Finals 2018 (0) | 2018.05.08 |
|---|---|
| ACM ICPC World Finals 2015 (1) | 2015.05.22 |
| ACM ICPC World Finals 2011 (0) | 2015.05.18 |
- Total
- Today
- Yesterday
- majority
- z-trening
- Boyer
- idea
- moore
- TRIE
- Dynamic Pramming
- BOI 2001
- Dijkstra
- ioi
- Parametric Search
- Greedy Method
- Divide & Conquer
- Tree
- IOI2013
- dynamic programming
- Boyer-Moore Majority Vote Algorithm
- Algorithm
- USACO
- HackerRank
- vote
- Knuth Optimization
- IOI2014
- Segment tree
- optimization
- BOI
- Splay Tree
- IOI2012
- BOI 2009
- IOI2011
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |