Processing math: 100%

프로그래밍/알고리즘

[알고리즘] Educational Codeforces Round 122 (Rated for Div. 2)

riroan 2022. 2. 1. 18:04

버추얼에 참가했다.

 

이번 대회는 다른 대회보다 쉬웠던 것 같다.

퍼포가 엄청났겠는데

 

A - Div. 7 [Solved!]

정수가 하나 주어졌을 때 변화하는 자릿수를 최소로 하며 7의 배수로 만드는 문제이다.

 

7의 배수이면 그냥 출력하고 아니라면 1의 자리를 0~9까지 변화하면서 7의 배수가 되는 수를 출력한다.

자릿수를 하나만 변화시켜도 7의 배수를 만들 수 있다.

 

B - Minority [Solved!]

이진문자열이 주어졌을 때 부분 문자열을 골라 0, 1중에 개수가 작은 문자를 전부 삭제한다.(같으면 무효) 이때 삭제한 문자의 수의 최댓값을 구하는 문제이다.

 

전체 문자열을 부분문자열로 선택하고 둘 중에 개수가 작은 문자의 수를 출력하면 된다.

만약 같은 경우는 갯수-1을 출력하면 된다.

 

C - Kill the Monster [Solved!]

몬스터와 플레이어의 능력치가 주어졌을 때 플레이어가 몬스터를 해치울 수 있는지 출력하는 문제이다.

단, 플레이어가 먼저 공격을 하고 플레이어는 전투 전에 아이템을 구입할 수 있다.

코인 1을 소비하여 공격력을 w, 체력을 a증가시킬 수 있다.

 

얼마 전에 RPG Extreme을 풀어서 재밌게 풀었다.

몬스터 체력, 몬스터 공격력, 플레이어 체력, 플레이어 공격력을 각각 hm,dm,hc,dc라고 하자.

몬스터가 플레이어를 이기려면 hcdm번, 플레이어가 몬스터를 이기려면 hmdc번 공격해야 한다.

위 두 수를 각각 nm,nc라고 하면 nmnc일 때 플레이어가 이기고, nm<nc일 때 몬스터가 이긴다.

또한 코인이 k개 주어졌으므로 0ik에서 플레이어의 능력치를 hc+ai,dc+w(ki)로 정하고 한 번이라도 이기는지 확인하면 된다.

k제한이 2105이므로 완전 탐색하면 된다.

 

D - Make Them Equal

길이가 n이고 1로 초기화된 배열 a를 적당한 연산을 k번 사용해서 배열 b로 만들고 싶다.

연산은 ai:=ai+aix이다. (x는 자연수)

연산이 끝난 후 ai=bii에 대해 ci의 코인을 얻는다고 할 때 얻을 수 있는 코인의 최댓값을 구하는 문제이다.

 

떠오르는 아이디어는 있는데 계속 WA를 받아서 포기했다. Editorial이 올라오기 전이어서 생각했던 아이디어를 적어보고자 한다.

우선 bi를 만드는 최소 횟수를 dp테이블에 저장하자.(제한이 1000이므로 O(n2)으로 충분하다.)

예를 들어 21,42,53

그러면 최대 무게가 k이고 dp[bi]를 무게로 하고 ci를 가치로 하는 배낭문제로 바뀐다. (근데 난 배낭문제 푸는 법을 몰랐다.)

그렇게 그리디하게도 풀어보고, 배낭문제 구글링을 통해서도 풀어봤는데 WA가 나왔다...

(추가)

Editorial에서 standard problem이라고 하는걸 보니 배낭문제는 맞는거같고 최대가 12인걸 고려해서 TLE도 안나왔는데 그냥 구현을 잘못한 것 같다.

 

슬슬 코포에 감이 잡히는게 느껴지고 조금만 더 노력하면 블루 갈 수 있을 것 같다.