티스토리 뷰
https://www.acmicpc.net/problem/24500
24500번: blobblush
길이 K의 수열 A가 같은 길이의 수열 B보다 사전순으로 앞선다는 것은, A의 1~(i-1)번째 원소와 B의 1~(i-1)번째 원소가 같으면서, A의 i번째 원소가 B의 i번째 원소보다 작은 i가 있다는 것이다.
www.acmicpc.net
배타적 논리합은 둘 중 하나의 비트만 1일 때 1이 된다.
7(0111) ⊕ 2(0010) = 5(0101)
배타적 논리합의 결과는 두 수의 최상위 비트보다 더 큰 수가 나올 수 없다.8(1000) 과 8 보다 아래의 수의 배타적 논리합의 최대값은 15(1111)가 최대임을 알 수 있다.
또한 1000은 그 아래에 0111이 존재하고, 1010과 같은 수도 그 아래에 0101과 같은 수가 존재하기 때문에 최상위 비트까지 1로만 구성되어 있는 수를 최대 2장으로 만들 수 있다.1000 ⊕ 0111 = 1111 , 1010 ⊕ 0101 = 1111처음 주어지는 수가 이미 7(111) 1로만 구성되어 있다면 해당 수가 최대 값임을 알 수 있고처음 주어지는 수가 1로만 구성되어 있지 않다면 그 수를 flip한 수와 배타적 논리합을 하여 최대 값을 구할 수 있다.1000 ⊕ 0111(1000의 flip) = 1111
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
int arr[100000];
int flip[100000];
int bitSize = 0;
void tran(unsigned long long N) {
if (N == 0) {
arr[bitSize] = 0;
bitSize++;
return;
}
while (N > 0) {
if (N % 2 == 1) {
N = N / 2;
arr[bitSize] = 1;
}
else {
N = N / 2;
arr[bitSize] = 0;
}
bitSize++;
}
}
void bitflip() {
for (int i = 0; i < bitSize; i++) {
if (arr[i] == 0) {
flip[i] = 1;
}
else {
flip[i] = 0;
}
}
}
unsigned long long reTran() {
unsigned long long sum = 0;
unsigned long long gop = 1;
for (int i = 0; i < bitSize; i++) {
if (flip[i] == 1) {
sum = sum + gop * flip[i];
gop = gop * 2;
}
else {
gop = gop * 2;
}
}
return sum;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
unsigned long long N;
cin >> N;
tran(N);
int flag = 1;
for (int i = 0; i < bitSize; i++) {
if (arr[i] == 0) {
flag = 0;
break;
}
}
if (flag == 1) {
cout << 1 << '\n';
cout << N;
return 0;
}
bitflip();
unsigned long long result = reTran();
cout << 2 << '\n';
cout << result << " " << N;
}'PS' 카테고리의 다른 글
| [백준] 1967번 트리의 지름 (0) | 2022.03.29 |
|---|---|
| [백준] 5547번 일루미네이션 (0) | 2022.03.26 |
| LIS (0) | 2021.01.28 |
| 2차원 배열을 함수의 인자로 전달(포인터로) (0) | 2021.01.20 |
| clock sync (0) | 2021.01.17 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 골목길
- 소셜네트워킹어플리케이션
- 스택
- 6539
- 7511
- 1918
- tea time
- 후위 표기식
- 벨만-포드
- 1738
- 골목길C++
- 어린왕자 C++
- 벨만포드
- C++
- 11657
- 상범빌딩
- 6018
- 1004
- 중위 표기식 후위 표기식으로 변환
- 타임머신
- 백준
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함
