codeforces (#648 Div2) 1365E Maximum Subsequence Value

题目链接:
    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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值