[Codeforces #796] A. Cirno's Perfect Bitmasks Classroom

tolelom·2022년 6월 27일
0

코드포스

목록 보기
3/4

문제 설명

문제 링크
정수 xx가 주어지면 xandy>0x and y > 0이고 xxory>0x xor y > 0인 수 yy 중 제일 작은 값 yy를 구하시오.

알고리즘

  1. LSB부터 MSB까지 순회하면서 1인 비트를 찾아 yy도 같은 위치의 비트를 켜준다.

  2. x=yx = y이면 다시 LSB부터 MSB까지 순회하면서 0인 비트를 찾아 yy에서 같은 위치의 비트를 켜준다. xyx \neq y라면 패스

  3. 구한 yy가 정답.

    코드

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
 
int tc;
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
 
    // init
    cin >> tc;
 
    for (int tcCnt = 1; tcCnt <= tc; ++tcCnt) {
        int x;
        cin >> x;
 
        int ans = 0;
        for (int i = 0; i < 32; ++i) {
            if (x & (1 << i)) {
                ans += (1 << i);
                break;
            }
        }
        
        if (ans == x) {
            for (int i = 0; i < 32; ++i) {
                if ((x & (1 << i)) ^ (1 << i)) {
                    ans += (1 << i);
                    break;
                }
            }
        }
        
        cout << ans << '\n';
    }
}

느낀 점...

비트 연산자를 오랫만에 써서 구글링을 하면서 푼 문제
대회에서 나올 수도 있으니 숙지해야겠다.

profile
이것 저것 작성하는 기술 블로그

0개의 댓글