E.Maximum Subsequence Value
题意: 给n个数,要你选出k个数,先把他们转为2进制,对于二进制的第i位,如果你选的k个数里至少有max(1,k−2)个数字的二进制的第i位是1,答案就+2的i次方。 尽量使得ans大。
tips:k>3一定不会比k<=3更优。
简单证明:如果k<3,则max(1,k−2) == 1.此时,选的三个数算出的答案就是这三个数的 “|”运算的值。(只要这一位有至少一个1,则答案便可增加)。
选出这三个数后,假如再选一个数(k==4),则这个数不会对原有的答案有所贡献,反而可能使答案减小。
【
如果原来答案的某一位是1:
A.原来三个数的这一位有>1个1,加上新数,这一位仍然不变;
B.原来三个数的这一位有1个1,新数的这一位是1,这一位仍然不变;否则,这一位变成0了。
如果原来答案的某一位是0:
表示原来三个数这一位都是0,加上新数,即使新数的这一位是1,也只有1个1,小于max(1,k-2)==2,对答案没有贡献。
】
n<500,直接n3循环即可。
#include<bits/stdc++.h>
#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\n",ans);
return 0;
}