※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 23257번 문제인 비트코인은 신이고 나는 무적이다이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/23257
23257번: 비트코인은 신이고 나는 무적이다
코인 경력 4년차, 차트에 통달한 찬호는 이전 $N$개의 월봉을 통해 다음 월봉의 절댓값을 예측할 수 있는 아래의 공식을 만들어냈다. (다음 월봉의 절댓값) = 이전 $N$개의 월봉 중 중복을 허용해
www.acmicpc.net
주어지는 수의 절댓값의 범위가 0 이상 1023 이하임을 확인하자.
이를 이용하여 수 m개를 xor해 만들 수 있는 각 수 X에 N가지 수를 각각 xor해보는 것으로 수 m+1개를 xor해 만들 수 있는 수들의 목록을 구해낼 수 있다.
이 과정은 최악의 경우 X 1023가지에 N가지 수를 xor해보는 약 100만회의 연산이 단계당 필요하다.
이 과정은 가벼운 비트연산 위주로 구성되어있으므로 이를 반복하는 것으로 충분히 제한시간 내에 문제를 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int M, N;
int num[100];
bool arr[101][1024];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M;
for (int i = 0; i < N; i++) {
int& x = num[i]; cin >> x;
x = abs(x);
arr[1][x] = 1;
}
for (int m = 1; m < M; m++) {
for (int i = 0; i < 1024; i++) {
if (arr[m][i]) {
for (int k = 0; k < N; k++) {
arr[m + 1][i ^ num[k]] = 1;
}
}
}
}
for (int i = 1023; i > -1; i--) {
if (arr[M][i]) {
cout << i;
return 0;
}
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 1294 // C++] 문자열 장식 (0) | 2022.07.20 |
---|---|
[BOJ 20654 // C++] 음료수는 사드세요 제발 (0) | 2022.07.19 |
[BOJ 12351 // C++] Hedgemony (Small) (0) | 2022.07.17 |
[BOJ 1833 // C++] 고속철도 설계하기 (0) | 2022.07.17 |
[BOJ 24512 // C++] Bottleneck Travelling Salesman Problem (Small) (0) | 2022.07.17 |