Processing math: 100%

프로그래밍/알고리즘

[알고리즘] Codeforces Round #774 (Div. 2)

riroan 2022. 3. 5. 13:11

요즘 빠른 3솔을 목표로 하고 있는데 이번은 C에서 너무 막혔다.

C의 상태가..?

 

A - Square Counting [Solved!]

n+1개의 수 a1,a2,...,an,an+1이 주어질 때 0ai<n이거나 ai=n2을 만족한다. 그리고 n+1i=1ai=s를 만족하는 ai=n2의 개수를 구하는 문제이다.

 

sn2을 최대한 많이 넣으면 된다.

이를 구하려면 sn2을 계산하면 된다.

 

B - Quality vs Quantity [Solved!]

수열 a1,a2,,an이 주어지고 각 수를 빨간색, 파란색, 색칠하지 않음 중 하나의 상태로 만들 때 빨간 수의 합 > 파란수의 합 이면서 빨간수의 개수 < 파란수의 개수 로 만들 수 있는 방법이 있는지 출력하는 문제이다.


     

우선 수열을 정렬한다.

* Case 1) n이 짝수

뒤에서부터 n21개를 빨간색으로, 앞에서부터 n2개를 파란색으로 칠하면 답이 된다.

 

* Case 2) n이 홀수

뒤에서부터 n2개를 빨간색으로, 앞에서부터 n2+1개를 파란색으로 칠하면 답이 된다.

 

이렇게 하면 파란색이 많다는게 보장되고 빨간색에 최대한 큰 값들이 들어갈 것이다.

이제 각 색깔로 색칠된 수들의 합을 비교하여 가능여부를 출력하면 된다.

 

C - Factorials and Powers of Two [Solved!]

2의 제곱수나 어떤 수의 팩토리얼을 powerful하다고 하자. 수가 주어지면 서로 다른 powerful한 수들의 합으로 나타낼 수 있는지 있다면 사용한 수의 최소개수를 출력하는 문제이다.

 

우선 주어진 수를 n이라고 하면 이는 언제나 대응되는 2진수가 있기 때문에 powerful한 수들의 합으로 나타낼수 있다는 것이 보장된다. (-1을 출력할 일이 없음)

이 경우 2진수로 변환한 후 1의 개수를 합해주면 된다.

1n1012이므로 범위에 해당하는 팩토리얼을 전처리해준다.

개수가 14개 나오는데 1, 2는 2의 제곱수와 겹치므로 빼주면 12개가 나온다.

이제 각 팩토리얼 수를 f1,f2,,f12라고 하면 각 수를 뺐을 때와 빼지 않았을 때를 모두 구한다.

모두 구하면 n,nf1,nf2,,nf12,nf1f2,nf1f3,,nf1f12, 같은 모양이 나올것이다.

전체 개수는 212=4096개가 나온다.

각 수를 이진수로 바꿔 1의 개수를 합하고 뺀 팩토리얼 개수를 더한 뒤 최솟값을 구하면 정답이 된다.

 

C번문제를 풀며 맞왜틀을 수십번은 외쳤고 7번정도 제출 뒤 마지막에 재귀함수에서 base condition이 잘못됐다는걸 발견해서 400점이라도 얻었다.