본문 바로가기
Problem Solving/Codeforces

Codeforces Round #322 (Div. 2)

by hongjun7 2015. 9. 28.

Contest Problems / Contest Result

A. Vasya the Hipster

빨간 양말의 개수 a와 파란 양말의 개수 b가 주어졌을 때, 서로 다른 색으로 짝을 지을 수 있는 최대 양말 쌍의 개수와 그렇게 쌍을 지은 양말을 제외하고, 한 가지 양말 색깔만으로 만들 수 있는 양말 쌍의 개수를 출력하는 문제이다.

전자는 min(a, b)이고 후자는 (max(a, b)-min(a,b))/2이다.


B. Luxurious Houses

n개의 건물 높이가 주어진다. 매 index의 건물 a( i )마다 오른쪽 건물들의 높이가 모두 a( i )보다 작아지려면, a( i )를 얼마나 증가시켜야 하는지 그 값을 출력하는 문제이다.

가장 큰 index부터 작은 index순으로 a( i )의 최댓값을 저장하여 O(N)에 해결할 수 있다.


C. Developing Skills

n개의 수 a( i )가 주어진다. total rating은 int( a( i ) / 10 )의 합으로 정의된다. 수열의 어떤 원소를 1 증가시키는 것을 1 improvement를 했다고 정의할 때(단, improve된 a( i )는 100 이하), 전체 수열 a에 k improvement를 하여 total rating을 최대화하는 것이 문제이다.

각 a( i )의 십의 자리 숫자를 증가시키는데 필요한 비용으로 오름차순 정렬한 다음에 가능한 한 최대한 improvement해보고, 모든 a( i )들의 십의 자리 숫자를 1번씩 증가시켜보았다면 100을 넘지 않는 선에서 k를 각 a( i )에 순서대로 분배하는 greedy algorithm으로 해결 가능하다. O(n log n)이다.


D. Three Logos

3개의 직사각형이 주어지면 그걸 잘 배치해서 하나의 정사각형으로 만드는 문제이다.

일반화를 잘 시켜서 아래와 같이 해결할 수 있다.


F. Zublicanes and Mumocrates

n개의 정점과 n-1개의 간선으로 구성된 트리가 주어진다. 이 때, 각 정점들에 2가지 종류의 색깔을 반드시 칠해야한다. 색칠을 다 했을 때, (항상 짝수개인) 말단 노드들은 2가지 종류의 색깔로 균등하게 색칠되어야 한다. 조건에 맞게 색칠을 하면서, 간선 양쪽의 정점에 서로 다른 색깔이 칠해진 간선의 수를 최소화해야하는 것이 문제이다.

D( a , b , c ) : a번 노드의 색깔이 c(0 또는 1)이고 a의 부트리(a를 포함) 중 말단 노드의 색깔이 0인 것의 개수가 b개일 때, a의 부트리 간선들 중 간선 양쪽 정점에 서로 다른 색깔이 칠해진 것들의 최소 갯수

어떤 노드 a를 고려할 때, a의 자식들에 대한 계산은 끝났다고 가정하고(말단 노드인 경우는 별도의 계산없이 초기화만 해주면 되므로), a의 자식들이 p(1), p(2), ... p(k)가 있다고 하자.

이제 냅색하듯이 T(x, i+j, x_color) = min ( T(x, i+j, x_color), D(x, i, x_color) + D(p(k), j, p(k)_color + (x_color != p(k)_color) ) 라는 점화식으로 매 p(k)마다 D(x)를 T(x)로 갱신해주면 된다. D(x)에 누적해서 계산하다보면 p(k-1)까지 고려한 것과 p(k)까지 고려하는 것이 뒤섞이므로 저런식으로 테이블을 채웠다.

각 노드 a의 dp값인 D(a)의 상태들에 대한 정보를 처음에 D(a)를 채울 때 한 번, a의 부모에서 D(a)를 참조할 때 한 번 더 참조한다. 따라서 각 상태에 대해서 상수번의 참조만이 일어나므로 시간복잡도를 가진다.


'Problem Solving > Codeforces' 카테고리의 다른 글

Codeforces Round #125 (Div. 1)  (0) 2016.01.26
Codeforces Round #290 (Div. 2)  (0) 2016.01.24
Codeforces Round #292 (Div. 1)  (0) 2016.01.10
Codeforces Round #323  (0) 2015.10.05
Codeforces Round #321 (Div. 2)  (0) 2015.09.27

댓글