PS
백준 16974번 레벨 햄버거
남마허
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;
}
반응형