대회링크 : https://codeforces.com/contest/1809
A. Garland
문제 : 모든 전구를 켜는데 필요한 최소 횟수 출력
조건 : 같은 종류의 전구를 이전에 활성/비활성 했을 경우 해당차례에 선택 불가
전구가 모두 같은 종류 일 경우 : 불가능(-1)
전구하나만 다른 종류일 경우 : 6 [aaab : b - a - b - a - b - a]
그 외 : 4
aabb : a - b - a - b
abcc : a - c - b - c
abcd : a - b - c - d
B. Points on Plane
문제 : n개의 물건을 좌표평면에 올렸을 때 원점으로부터 거리들의 최댓값이 최소가 될 때의 최댓값 출력
조건 : 임의의 두 물체 맨해튼 거리는 항상 2 이상이어야 한다. (유클리디안 X)
2가지 경우로 나누어 보면 쉽게 풀 수 있다.
거리들의 최댓값을 x라 했을 때
x가 짝수 : (0,0)로 시작 (2x,2y) -> x[0] = 1, x[2] = 9, x[4] = 25 ...
x가 홀수 : (±1,±1)로 시작(±1+2x,±1+2y) -> x[1] = 4, x[3] = 16, x[5] = 36 ...
즉 n이 1개일 때부터 최댓값(x)을 보면
(n,x) = (1,0), (2,1), (3,1), (4,1), (5,2), (6,2), (7,2), (8,2), (9,2), (10,3), (11,3) ...
즉 x = sqrt(n-1) 의 값을 나타낸다.
이때 주의 사항은 n의 값이 10^18까지 나올 수 있으므로
(long long)sqrt(n-1)을 할 경우 오차의 발생으로 틀리게 된다.
따라서 안정적인 이분탐색등을 사용하여 계산해 주면 된다.
//long long형 제곱근
long long sqrt(long long n) {
if (n <= 1) return n;
long long lo = 0, hi = n;
while (lo <= hi) {
long long mid = (lo + hi) / 2;
if (mid > n / mid)
{
hi = mid - 1;
}
else {
lo = mid + 1;
}
}
return hi;
}
C. Sum on Subarrays
문제 : n개의 원소를 갖는 배열 이 있을 때 k 개의 원소의 합이 양수인 부분 배열을 갖는 배열 출력
조건 : 각 원소의 범위는 -1000에서 1000까지 가능하다.
주의사항 : 0은 양수도 음수도 아니다.
풀이에 다양한 방법이 있겠지만 다음과 같은 방법을 사용하였다.
우선 n=5, k=7이라고 가정했을 때 5칸의 배열을 다음과 같이 만들어준다.
(-1,-2,-3,-4,-5)
첫 번째부터 순회하며 k값이 0보다 클경우에만 수행한다.
k=7 -> 6 = (-1+2,-2,-3,-4,-5) = (1,-2,-3,-4,-5) = 1개
k=6 -> 5 = (1+3,-2,-3,-4,-5) = (4,-2,-3,-4,-5) = 2개
k=5 -> 4 = (4+4,-2,-3,-4,-5) = (8,-2,-3,-4,-5) = 3개
k=4 -> 3 = (8+5,-2,-3,-4,-5) = (13,-2,-3,-4,-5) = 4개
k=3 -> 2 = (13,-2+3,-3,-4,-5) = (13,1,-3,-4,-5) = 5개
k=2 -> 1 = (13,1+4,-3,-4,-5) = (13,5,-3,-4,-5) = 6개
k=1 -> 0 = (13,5+5,-3,-4,-5) = (13,10,-3,-4,-5) = 7개
위와 같은 방법으로 계산할 경우 조건에 맞는 배열을 구 할 수 있다.
D. Binary String Sorting
문제 : 주어진 이진배열을 조작하여 오름차순을 만들 때의 비용의 최솟값 출력
조작 1 : 연속한 두 원소를 1000000000001의 비용으로 치환할 수 있다.
조작 2 : 임의의 원소를 1000000000000의 비용으로 삭제할 수 있다.
해당배열을 첫 번째부터 순차적으로 보며 다음과 같이 수행한다.
해당 위치보다 왼쪽에 있는 0은 제거할 필요가 없다.
해당 위치보다 오른쪽에 있는 1은 제거 할 필요가 없다.
즉 제거해야 되는 개수를 구해준다.
해당위치가 1인 경우 제거 대상에서 임시로 제외한다.
다음위치가 0인 경우 제거 대상에서 임시로 제외한다.
해당위치보다 다음위치가 더 작을 경우 교환을 통해 교체해 준다.
이렇게 차례대로 구한 비용들의 최솟값을 출력한다.
E,F,G 아직 실력 부족으로 접근하지 못하였다.
'후기' 카테고리의 다른 글
[Codeforces] Round 862 Div.2 후기 (0) | 2023.04.03 |
---|---|
[Codeforces] Round 860 Div.2 후기 (0) | 2023.03.27 |
[Codeforces] Round 856 Div.2 후기 (0) | 2023.03.05 |
[Codeforces] Round 855 Div.3 후기 (0) | 2023.03.03 |
[데브매칭] 2021 Dev-Matching: 웹 백엔드 개발자(하반기) 후기 (0) | 2021.10.19 |