Codeforces Round #648 (Div. 2) E.Maximum Subsequence Value

E.Maximum Subsequence Value
제목: n 개의 수 를 주 고 k 개의 수 를 선택 하 라. 먼저 그들 을 2 진법 으로 바 꾸 고 2 진법 의 i 위 에 대해 서 는 k 개의 수 에 max (1, k - 2) 개의 숫자 가 있 는 2 진법 의 i 위 가 1 이 라면 답 은 + 2 의 i 제곱 이다.최대한
tips: k > 3 은 k < = 3 보다 더 좋 지 않 습 니 다.간단 한 증명: k < 3 이면 max (1, k - 2) = 1. 이때 선택 한 세 개의 숫자 로 계산 한 답 은 바로 이 세 개의 수의 "|" 연산 의 값 이다.(이 한 사람 이 적어도 한 사람 이 있 으 면 답 은 증가 할 수 있다).이 세 개 수 를 고 른 후 한 개 수 (k = = 4) 를 더 고 르 면 이 수 는 기 존의 답 에 기여 하지 않 고 오히려 답 을 줄 일 수 있다.[원래 답 의 한 분 이 1: A 라면 원래 세 개의 숫자 인 이 분 은 > 1 개 1 이 고 새 숫자 를 더 하면 이 분 은 변 하지 않 습 니 다. B. 원래 세 개의 숫자 인 이 분 은 1 개 1 이 고 새 숫자 인 이 분 은 1 입 니 다. 이 분 은 변 하지 않 습 니 다. 그렇지 않 으 면 이 분 은 0 이 됩 니 다. 원래 답 의 한 분 이 0 이 라면 원래 세 개의 숫자 인 이 분 은 0 이 고 새 숫자 를 더 하면 새 숫자 가 되 더 라 도 0 이 됩 니 다.의 이 분 은 1 이 고 1 개 만 있 으 며 max (1, k - 2) = = 2 보다 작 아 답 에 기여 하지 않 았 습 니 다.]
n < 500, 직접 n3 순환 하면 됩 니 다.
#include
#define ll long long

using namespace std;

int n;
ll book[505], ans;

int main(){
	scanf("%d",&n);
	for(int i = 1; i <= n; ++i)	scanf("%lld",&book[i]);
	for(int i = 1; i <= n; ++i)
		for(int j = i; j <= n; ++j)
			for(int k = j; k <= n; ++k)
				ans = max(ans, book[i] | book[j] | book[k]);
	printf("%lld
"
,ans); return 0; }

좋은 웹페이지 즐겨찾기