Processing math: 100%
본문 바로가기

각종 대회

AtCoder Beginner Contest 189 (올솔)

A - Slot

문제에서 하라는 대로 하면 됩니다. if문으로 C1 = C2 = C3일 때 Won, 그렇지 않으면 Lost를 출력합니다.

 

B - Alcoholic

이것도 문제에서 하라는 대로 v×p100>x이 되는 시점을 출력합니다. 단, 부동 소수점 때문에 발생하는 실수 오차에 주의해야 합니다. 실수 오차를 없애기 위해 v×p>x×100이 되는 시점을 출력하면 정수계산만으로 풀 수 있습니다.

 

C - Mandarin Orange

N10000이니까 O(N2)에 가능합니다. i번째 오렌지부터 시작해서 j번째 오렌지까지 먹을 때 x의 최댓값은 Ai,Ai+1,...,Aj 중 최솟값입니다. 따라서 i번째 오렌지부터 시작할 때, ji부터 N까지 늘려주며 x를 갱신하고 (ji+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)(2px,y)가 됩니다.

4번 연산 후에는 (x,y)(x,2py)가 됩니다.

 

1번부터 i번까지 연산을 적용한 후에, 모든 점들의 좌표가 (x,y)(ax+by+c,dx+ey+f)가 됩니다. 이때 a,b,c,d,e,f를 위의 성질을 이용해 각 연산마다 계산해주면, 모든 정점에 대해 연산을 적용하지 않아도 됩니다.

 

K개의 질의를 받았을 때, 이 KA에 대한 비내림차순으로 정렬하고 i번 연산까지 마친 후 Ai인 질의의 B의 현재 위치를 현재의 a,b,c,d,e,f를 적용해 찾아주면 됩니다.

 

구현이 조금 짜증납니다.

 

F - Sugoroku2

 

먼저 불가능한 경우를 확인해줍니다. A1,A2,..,AK에서 m개의 연속한 수가 존재한다면 지나갈 수 없습니다. 이 경우 1을 출력해줍니다.

 

나머지 경우는 전부 가능합니다. 0번에서 출발했을 때 기댓값을 p라고 하겠습니다. n번보다 큰 곳에서 출발했을 때 기댓값은 0입니다. i번에서 출발했을 때 기댓값은 (i+1i+m번에서의 기댓값의 평균 + 1)입니다. 만약 iA1,A2,...,Ak 중 하나라면, 기댓값은 p입니다. 이를 이용해 n1번의 기댓값을 구합니다. n1번의 기댓값을 구하면 n2번에서 출발했을 때 기댓값도 구할 수 있습니다. 마찬가지로 n3,n4,...번의 기댓값을 구할 수 있습니다. 이걸 계속하면 선이 됩니다

 

각 위치에서의 기댓값은 ai+bip로 나타납니다. 0번에서의 기댓값도 a0+b0p로 나타납니다. 그런데 이건 p입니다. 따라서 p=a0+b0p라는 일차방정식이 나오고, p=a01b0으로 구할 수 있습니다. b0=1인 경우는 없습니다. 불가능한 경우의 조건 때문입니다. 따라서 이게 답이 됩니다.

 

구현하는 방법은 다양합니다.