
A - Slot
문제에서 하라는 대로 하면 됩니다. if문으로 C1 = C2 = C3일 때 Won, 그렇지 않으면 Lost를 출력합니다.
B - Alcoholic
이것도 문제에서 하라는 대로 v×p100>x이 되는 시점을 출력합니다. 단, 부동 소수점 때문에 발생하는 실수 오차에 주의해야 합니다. 실수 오차를 없애기 위해 v×p>x×100이 되는 시점을 출력하면 정수계산만으로 풀 수 있습니다.
C - Mandarin Orange
N≤10000이니까 O(N2)에 가능합니다. i번째 오렌지부터 시작해서 j번째 오렌지까지 먹을 때 x의 최댓값은 Ai,Ai+1,...,Aj 중 최솟값입니다. 따라서 i번째 오렌지부터 시작할 때, j를 i부터 N까지 늘려주며 x를 갱신하고 (j−i+1)×x답과 비교하여 답을 갱신해주면 됩니다.
D - Logical Expression
오른쪽에서부터 보면서 OR이 나오면, OR 오른쪽이 True인 경우와 OR 왼쪽이 False인 경우로 나눕니다. OR 오른쪽이 True이면 그 왼쪽은 어떤 값이 되더라도 OR 연산까지 했을 때 True가 나오니까, OR이 i번째에 나왔다면 2i가지의 경우가 추가됩니다. OR 오른쪽이 False가 된다면 OR 왼쪽이 True여야 하므로 다시 OR이 나올 때까지 True만 있게 됩니다.
이 관찰을 잘 정리해보면, 1에다가 OR이 i번째에 나올 때마다 답에 2i를 더해주면 된다는 걸 발견할 수 있습니다.
E - Rotate and Flip
1번 연산 후에는 (x,y)→(y,−x)가 됩니다.
2번 연산 후에는 (x,y)→(−y,x)가 됩니다.
3번 연산 후에는 (x,y)→(2p−x,y)가 됩니다.
4번 연산 후에는 (x,y)→(x,2p−y)가 됩니다.
1번부터 i번까지 연산을 적용한 후에, 모든 점들의 좌표가 (x,y)→(ax+by+c,dx+ey+f)가 됩니다. 이때 a,b,c,d,e,f를 위의 성질을 이용해 각 연산마다 계산해주면, 모든 정점에 대해 연산을 적용하지 않아도 됩니다.
K개의 질의를 받았을 때, 이 K를 A에 대한 비내림차순으로 정렬하고 i번 연산까지 마친 후 A가 i인 질의의 B의 현재 위치를 현재의 a,b,c,d,e,f를 적용해 찾아주면 됩니다.
구현이 조금 짜증납니다.
F - Sugoroku2
먼저 불가능한 경우를 확인해줍니다. A1,A2,..,AK에서 m개의 연속한 수가 존재한다면 지나갈 수 없습니다. 이 경우 −1을 출력해줍니다.
나머지 경우는 전부 가능합니다. 0번에서 출발했을 때 기댓값을 p라고 하겠습니다. n번보다 큰 곳에서 출발했을 때 기댓값은 0입니다. i번에서 출발했을 때 기댓값은 (i+1 ~ i+m번에서의 기댓값의 평균 + 1)입니다. 만약 i가 A1,A2,...,Ak 중 하나라면, 기댓값은 p입니다. 이를 이용해 n−1번의 기댓값을 구합니다. n−1번의 기댓값을 구하면 n−2번에서 출발했을 때 기댓값도 구할 수 있습니다. 마찬가지로 n−3,n−4,...번의 기댓값을 구할 수 있습니다. 이걸 계속하면 선이 됩니다
각 위치에서의 기댓값은 ai+bip로 나타납니다. 0번에서의 기댓값도 a0+b0p로 나타납니다. 그런데 이건 p입니다. 따라서 p=a0+b0p라는 일차방정식이 나오고, p=a01−b0으로 구할 수 있습니다. b0=1인 경우는 없습니다. 불가능한 경우의 조건 때문입니다. 따라서 이게 답이 됩니다.
구현하는 방법은 다양합니다.