안녕하세요. 오늘은 가장 긴 부분수열을 구할 거예요.

문제

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

아이디어

조건 1을 만족하기 위해서 뽑힌 K개의 수 모두에 대해서 적어도 하나의 비트에서는 무조건 1이 다 있어야합니다.
그러므로 N개의 수 모두에서 각각에 비트 (1,2,4,8 등등)에서 1의 개수를 세고 최댓값을 출력해주면 됩니다.

소스코드

#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;


int main(void)
{
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	ll N, i, x, bitcnt[22] = { 0 };

	cin >> N;
	for (i = 1; i <= N; i++)
	{
		cin >> x;
		ll cnt = 0;
		while (x)
		{
			cnt++;
			bitcnt[cnt] += x % 2;
			x /= 2;
		}
	}

	ll ans = 0;
	for (i = 1; i <= 20; i++)
		ans = max(ans, bitcnt[i]);
	cout << ans;
}


감사합니다.

0개의 댓글