题目大意:有点难解释。。建议自己看题。我这里就粗略解释:给定一个数组 a a a,要求选出具有最大价值的子序列。假设此子序列的长度为 k k k,那么最大价值的计算方法为:对于这个序列中的所有数的二进制表示,第 i (从0开始)位上是1的数的数量若大于等 m a x ( k − 2 , 1 ) max(k - 2, 1) max(k−2,1),那么价值就可以 += 2 i 2^i 2i。(还没理解的可以看看样例解释)。
解题思路:我们贪心来看:
2
k
>
2
0
+
2
1
+
.
.
.
.
+
2
k
−
1
2^k>2^0+2^1+....+2^{k-1}
2k>20+21+....+2k−1所以我们要保证最高位的i是有贡献的。通过上面的
s
u
m
i
>
=
m
a
x
(
k
−
2
,
1
)
sum_i>=max(k-2,1)
sumi>=max(k−2,1)我们可以知道
最
多
2
个
0
,
最
少
1
个
1
最多2个0,最少1个1
最多2个0,最少1个1
我们假设我们刚好选了3个数得到最优解是
m
a
x
v
=
10110010100111
maxv=10110010100111
maxv=10110010100111,那么我们在选第4个数得时候,我们选了这三个数是最优解各个位置上得情况可能是,
111
,
110
,
100
111,110,100
111,110,100,假如说他在某个maxv的0位上有1,但是为什么在前3个的时候没选到呢?根据我们贪心的思想它高位是0,把组合成了
1000
1000
1000后使得高位对答案没有贡献了所以就不选了。所以最优答案一定是3个数。
#include <iostream>
#include <cstdio>
#include <stack>
#include <vector>
#include <map>
#include <cstring>
#include <deque>
#include <cmath>
#include <iomanip>
#include <queue>
#include <algorithm>
#include <set>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define _for(i,a,b) for( int i = (a); i < (b); ++i)
#define _rep(i,a,b) for( int i = (a); i <= (b); ++i)
#define for_(i,a,b) for( int i = (a); i >= (b); -- i)
#define rep_(i,a,b) for( int i = (a); i > (b); -- i)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f-
#define hash Hash
#define next Next
#define f first
#define s second
#define lowbit(x) (x & (-x))
using namespace std;
const int N = 6e5 + 10, M = 25 * N;
const double eps = 1e-10;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<LL,LL> PII;
#define ll long long
using namespace std;
int main()
{
int T,n,i,j,k;
cin>>n;
LL A[n],m=0;
for(i=0;i<n;++i)cin>>A[i];
for(i=0;i<n;++i)for(j=i;j<n;++j)for(k=j;k<n;++k)m=max(m,A[i]|A[j]|A[k]);
cout<<m;
}