SRM+408

=TournamentJudging=

Prob
구현문제

Sol
반올림시 소수 오차에 주의하여 정수로 처리하면 좋다.

=OlympicCandles=

Prob
매 턴마나 양초를 현재 턴의 갯수만큼 골라서 높이를 1씩 깎을건데(불을 켰다 끌 건데), 최대 지속 가능한 턴 수

Sol
그리디하게 매 턴마다 가장 높은 턴 갯수의 양초를 깎으면 된다. 더 낮은걸 깎을 이유가 없지여.

=MarblesInABag=

Prob
가방에 붉은 블럭, 파란 블럭이 몇 개씩 들어있고(총 홀수개), 게임을 한다. 내가 먼저 모든 블럭중에서 랜덤하게 한 블럭을 같은 확률로 꺼내고, 그 뒤에 상대는 무조건 파란 블럭을 꺼낸다. 상대가 파란 블럭을 꺼낼 수 없으면 상대의 승리. 막턴에 내가 꺼내는 블럭이 파란 블럭이면 나의 승리. 두 블럭의 초기 갯수 <= 4000 개가 주어질 때, 내가 이길 확률.

Sol
매 상태에서 나의 행동은 두 블럭중 하나를 꺼내는 것이고, 상태는 비가역적으로 방향성이 생기기 때문에 4000 * 4000 테이블에 각각 O(1) 연산으로, 총 O(4000 * 4000) DP

=CandyGame=

Prob
무방향 그래프가 주어지고, 각 노드에 사탕을 배치할 수 있다. 배치한 뒤에, 매 턴마다 임의의 사탕갯수 >= 2 인 노드를 골라 사탕 두개를 집어내어, 하나는 먹고 하나는 인접한 다른 노드에 재배치한다. target 노드가 주어지는데, 해당 노드에 사탕이 올라가면 나의 패배. 해당 노드에 사탕이 올라가지 않는 선에서 가능한 사탕을 그래프 위에 많이 얹고 싶다. 최대 갯수.

Sol
나와 인접한 노드 중에서 target 노드로부터의 거리가 나보다 긴 노드가 있다면 내 위치에는 사탕을 얹지 않는 것이 맞다. 왜냐면 내 위치에 얹는 1은 더 먼 곳에서 얹는 2와 같으니까.. 나와 인접한 노드 중 나보다 target과의 거리가 가까운 곳이 없는 노드들에 한해서 사탕을 얹는데 무조건 (1 << dist) - 1 개를 얹으면 안되는 것이, 먼 곳에서 온 사탕들이 중간에 합쳐져서 target 노드에 닿을 수 있게 된다. 이를 고려하여 가장 먼 노드에서부터 bfs를 돌며 그래프에서 후발 주자들이 갈 수 있는 노드를 지워가며 매 후발주자에 대하여 자신이 쌓을 수 있는 최대 갯수를 더해나간다.

= TournamentSeeding =

Prob
이리저리 꼬아놓은 구현 문제. 이게 게임 중간에 어떤 시점까지 일어났 던 경기를 모두 기록해뒀다는 게 중요함. 그걸 캐치못해서 해멨는데..

Sol
지금까지 있었던 사건은 모두 나열되어 있기 때문에 과거부분은 시뮬레이션하고 경기되지 않은 앞 부분만을 가능한 최선으로 끼워 넣어가면 된다.