-
백준 16974번 레벨 햄버거PS 2020. 3. 19. 11:53
https://www.acmicpc.net/problem/16974
16974번: 레벨 햄버거
상근날드에서 오랜만에 새로운 햄버거를 출시했다. 바로 레벨-L 버거이다. 레벨-L 버거는 다음과 같이 만든다. 레벨-0 버거는 패티만으로 이루어져 있다. 레벨-L 버거는 햄버거번, 레벨-(L-1) 버거, 패티, 레벨-(L-1)버거, 햄버거번으로 이루어져 있다. (L ≥ 1) 예를 들어, 레벨-1 버거는 'BPPPB', 레벨-2 버거는 'BBPPPBPBPPPBB'와 같이 생겼다. (B는 햄버거번, P는 패티) 상도가 상근날드에 방문해서 레벨-N 버거를 시켰
www.acmicpc.net
<접근방법>
모든 햄버거에 대해 문자열의 형태로 저장한다면 메모리 초과가 나옵니다.
문제에서 주어진 마지막 테케를 보면 알 수 있죠.
n번째 햄버거를 형상화 해봅시다.
b (n-1) p (n-1) b
^
이 때, x의 값에 따라서 답의 범위가 좁아진다는 것을 생각할 수 있습니다.
예로, x의 위치가 화살표가 가르키는 p라면 답은 1 + (n-1번째 햄버거 패티의 수) 가 되겠죠.
그러므로 x의 위치에 따른 값을 설정해줘야 합니다.
이 때, 필요한 값으로 레벨에 따른 햄버거의 크기와 패티이므로 값을 미리 저장해줍니다.
<느낀 점>
<코드>
#include <iostream> #include <algorithm> #include <string> using namespace std; int n; long long x; long long h[51]; long long p[51]; long long dfs(int n, long long x) { long long half = (h[n] - 1) / 2; if (n == 1) { if (x == 0) { return 0; } else if (x == 1) { return 0; } else if (x == 2) { return 1; } else if (x == 3) { return 2; } else { return 3; } } if (x == 1) return 0; else if (x == half) return p[n - 1]; else if (x == half + 1) return p[n - 1] + 1; else if (x > half + 1) { return p[n - 1] + 1 + dfs(n - 1, x - (half + 1)); } else { return dfs(n - 1, x - 1); } } int main() { cin >> n >> x; p[1] = 3; h[1] = 5; for (int i = 2; i <= n; i++) { p[i] = p[i - 1] * 2 + 1; h[i] = h[i - 1] * 2 + 3; } cout << dfs(n, x) << '\n'; return 0; }
반응형'PS' 카테고리의 다른 글
백준 17069번 파이프 옮기기2 (0) 2020.03.22 백준 16931번 겉넓이 구하기 (0) 2020.03.21 백준 16948번 데스 나이트 (0) 2020.03.19 백준 16928번 뱀과 사다리 게임 (0) 2020.03.19 백준 16968번 차량 번호판1 (0) 2020.03.19