본문 바로가기

PS/Codeforce

Codeforces Round #802 (Div. 2) Virtual 후기

C번이 만만치않았습니다. D번은 문제에 대한 접근도 어렵더라고요. 결국 풀지 못했습니다. 에디토리얼을 보면 나중에 D까지 추가할 것 같습니다.

 

A번은 n과 m의 등차수열합을 이용하는 문제였습니다. 가장 거리가 작은 경로는 윗변에서 오른쪽변으로 내려올수밖에없었습니다. 식은 (m*((m+1)/2-1))+((n*(n+1))/2*m) 이런 식으로 나오게 됩니다. 

 

B번은 어떤 수에 같은 자리수를 더해서 펠린드롬을 만드는 문제였습니다. 다만 10만자리라 파이썬으로 풀었으면 쉽게 풀 수 있는 문제일겁니다.  저는 c++이 익숙해서 문자열로 쪼개 풀었습니다.  앞자리가 9가 아닌이상 9*자리수 꼴로 만들면 쉽게 펠린드롬이 됩니다. 다만 앞자리가 9면 같은 자릿수를 더해서 9*자리수 꼴로 만들 수 없죠

따라서 1*(자릿수+1)로 만들려고 했습니다. 각 자리마다 11-'각 자리'를 빼서 더하면 1꼴이 나오게 풀었습니다. 0과 1은 예외처리를 해야하고요. 1씩올림도 신경써야합니다.

 

C번은 아이디어가 필요한 문제였습니다. 우리 목표는 수열을 같은수로 만드는 것입니다. 한번에 빼거나 더할수 있으니까요. 직관적으로 답을 구할 수 있습니다. 수열 앞부분부터 차례차례 나아가면 됩니다. 예를들어 i번째 자리라고 해봅시다 i+1자리가 크거나 작을때 바꿀 필요가 있겠죠. a(i)<a(i+1)일 경우 i+1부터 수열 끝까지 a(i)랑 같게 만들면 되겠죠 a(i+1)..a(n)까지 차이만큼 뺍니다. 반대는 a(1)..a(i)까지하면 되겠죠. 이때 일일이 뺄필요없이 변수로 관리하면 됩니다.