※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 11391번 문제인 분배이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/11391 

 

0부터 \(2^N-1\)까지의 정수를 비트 수와 크기가 같은 \(2^K\)개의 집합으로 분할하는 문제이다.

 

0 이상 \(2^N-1\) 이하의 이진수 \(x\)에 대하여 \(x\)와 \(2^N-1-x\)는 \(2^N\)보다 낮은 각 자리에 대하여 대응되는 모든 비트의 상태가 서로 다름을 관찰하자. 따라서 모든 \(x\)와 \(2^N-1-x\)의 쌍은 같은 개수(\(N\)개)의 비트를 포함하게 된다.

 

주어지는 \(N\)과 \(K\)의 값은 다름이 보장되므로, \(x\)와 \(2^N-1-x\)의 쌍들을 같은 개수로 분배해 \(2^K\)개의 집합을 구성하면 문제의 답 중 하나를 구성할 수 있다. 이를 출력해 문제를 해결하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int N, M, K;
int val;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N >> M;
	N = (1 << N), M = (1 << M);
	K = N / M;
	for (int m = 0; m < M; m++) {
		for (int k = 0; k < K; k += 2) {
			cout << val << ' ' << N - val - 1 << ' ';
			val++;
		}
		cout << '\n';
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 16400 // C++] 소수 화폐  (0) 2024.05.10
[BOJ 19949 // C++] 영재의 시험  (0) 2024.05.09
[BOJ 15553 // C++] 난로  (0) 2024.05.07
[BOJ 25917 // C++] Prime Arrangement  (0) 2024.05.06
[BOJ 18231 // C++] 파괴된 도시  (0) 2024.05.05

+ Recent posts