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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值