题目链接:
https://codeforces.com/problemset/problem/1365/E
题目大意:
给你一个长度为n的数列 (1<=n<=500) ,每个数ai (1<=ai<=1e18),你可以从中选 k(k任意) 个数,那么你将得到一个答案ans,ans的计算方式为,一开始ans为0,对于选的k个数的二进制来说,如果第i位1出现的次数大于等于max(1, k-2) 则ans += (2 ^ i)。现在求最大的ans。
输入与输出:
输入1:
3 (n)
2 1 3 (长度为n的数列)
输出1:
3
输入2:
3
3 1 4
输出2:
7
输入3:
1
1
输出3:
1
输入4:
4
7 7 1 1
输出4:
7
思路:
其实最佳答案的k一定为3。因为,当k>=3 时每当你加入一个新的数字,
总数k->k+1
要求k-2->k-1
那么对于你加入这个数所有的二进制位的1,如果要对答案做出贡献,则之前这一位1必须已 经出现过至少k-2次,那么在总数为k时,这一位1已经被算入到答案里去了。
那么确定k为3了,直接暴力可求,复杂度n^3,时间2s可行。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn = 505;
LL xx[maxn];
LL res = 0;
int main()
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%lld", xx + i);
if (n <= 3) {
for (int i = 1; i <= n; i++)
res |= xx[i];
}
else {
for (int i = 1; i <= n; i++)
for (int j = i + 1; j <= n; j++)
for (int k = j + 1; k <= n; k++)
res = max(res, xx[i] | xx[j] | xx[k]);
}
printf("%lld\n", res);
return 0;
}