티스토리 뷰

ps

codeforces round 811 (div.3)

logwns 2022. 8. 6. 15:35

A. Everyone Loves to Sleep

 

문제 :

현재의 시각과 특정 시간에 울리는 n개의 알람이 있을 때 가장 처음으로 울리는 알람까지의 시간이 얼마나 되는지 구하면 된다. 

 

 

풀이 :
n개의 시각 중 현재 시각보다 작으면 하루(24시간)를 더해준다. 그리고 시간을 분 단위로 바꿔서 가장 차이가 적게 나는 값을 다시 시  분 형태로 바꿔주면 된다.

 

 

코드 :
cpp
열기

 


 

B. Remove Prefix

 

문제 :

길이가 n인 수열과 수열의 가장 첫 번째 원소를 지우는 연산이 있을 때 수열의 모든 원소가 최대 한 번씩만 등장하기 위해 사용해야 하는 연산의 최소 횟수를 구하면 된다.

 

 

풀이 :

1ai2×105이므로 원소가 중복되는지 검사하는 배열을 만든다. 배열은 값은 처음에 모두 0으로 하고 수열의 처음부터 끝까지 보며 각 원소의 위치를 저장한다. 이때 저장돼있던 배열의 값이 0이 아니면 원소가 중복된다는 뜻이므로 저장된 위치가 답이 될 수 있는지 확인한 후 현재의 위치 값으로 바꿔준다.

 

 

코드 :

cpp
열기

 


 

C. Minimum Varied Number

 

문제 :

한자리 수들을 중복되지 않게 최소로 사용하여 합이 s가 되면 된다.

 

 

풀이 :

9부터 1까지 1씩 감소시키면서 s보다 작으면 s에서 빼준다. 빼준 숫자들을 오름차순으로 출력하면 된다.

 

 

코드 :

cpp
열기

 


 

D. Color with Occurrences

 

문제 :

문자열 tn개의 문자열이 있을 때 n개의 문자열들을 최소로 사용하여 t를 만들 때 그 횟수를 구하면 된다.

문자열의 각 값들이 겹쳐도 된다. 예를 들어 s1=ba,s2=aba라 했을 때 s1s2를 합쳐 baaba도 되지만 baba도 만들 수 있다.

 

 

풀이 :

t의 길이가 최대 100, si(n개 문자열 중 i번째 문자열)의 길이가 최대 10이라 완전 탐색으로 해도 시간 안에 답이 구해진다. t에서 각 위치의 문자들이 한번 이상은 있어야 하기 때문에 앞에서부터 순서대로 문자를 채워간다. t에서 가장 마지막으로 완성된 문자의 위치를 i1이라 하면 i번째 문자를 포함하면서 아직 포함되지 않은 문자를 가장 많이 채울 수 있는 si를 다음으로 사용하고 이를 t의 모든 문자가 채워질 때까지 반복하면 된다. 만약 어떤 si로도 채울 수 없다면 1이 된다.

 

코드 :

cpp
열기

 


 

E. Add Modulo 10

 

문제 :

n개의 정수 수열 a1,a2,...,an이 있고 어떤 원소의 10으로 나눈 나머지를 자신에게 더할 수 있는 연산이 있다. 예를 들어 122를 더하여 14가 될 수 있고 또 14에서 4를 더하여 18이 될 수 있다. 이때 이런 수열과 연산을 통하여 모든 원소가 같은 값을 가지게 할 수 있는지 구하면 된다.

 

 

풀이 :

어떤 수가 홀수라면 짝수로 만들기 위해 10으로 나눈 나머지를 한번 더해준다.

(1) 어떤 수가 5로 나누어 떨어질 때 : 10n(0n인 정수)형태로 만들어 준 뒤 10으로 나눴을 때 나오는 몫의  종류가 1이하면 된다.

(2) 어떤 수가 5로 나누어 떨어지지 않을 때 : 24862...로 반복되는데 반복될 때마다 20이 증가하므로 20으로 나눈 나머지가 같은지 보면 된다. 먼저 일의 자리를 2로 만들어준 뒤 20으로 나눈 값의 종류가 1이하면 된다.

 

 

코드 :

cpp
열기

 


 

F. Build a Tree and That Is It

 

제 :

 

 

풀이 :

 


 

G. Path Prefixes

 

문제 :

1을 루트로 하면서 n개의 정점으로 구성된 트리가 있고 각 간선에는 ai,bi의 양수 가중치가 있다.

1부터 임의의 u(2un)까지 가는 경로의 aiA라 하고,

1부터 v(1부터 u까지 경로 중 임의의 원소)까지 가는 경로의  biB라 할 때

AB를 만족하게 하는 v1부터 몇 개의 간선을 거쳐오는지를 구하면 된다. (1을 제외한 모든 원소에 대하여)

 

 

풀이 :

1부터 u까지 가는 간선의 가중치가 모두 양수이므로 이동할수록 계속 누적되는 값은 계속 증가한다. 각 정점들에 대해 1부터 자신까지의 A(=ai)를 구해놓고 1부터 트리를 dfs로 탐색하는데 각 간선의 값이 누적될 때마다 그 값을 벡터에 저장해놓는다. 그러면 어떤 정점에서 v를 구할 때 저장된 벡터의 값들 중 자신의 A값보다 작은 값들 중 제일 큰 값의 위치가 답이 된다. 이를 이분 탐색으로 빠르게 구할 수 있다.

 

 

코드 :

cpp
열기

'ps' 카테고리의 다른 글

codeforces round 814 (div.2)  (0) 2022.08.25
codeforces round 813 (div.2)  (0) 2022.08.20
codeforces round 812 (div.2)  (0) 2022.08.17
educational codeforces round 133  (0) 2022.08.11
codeforces round 810 (div.2)  (0) 2022.08.04
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함