贪心 ---- E. Maximum Subsequence Value[位运算]

E. Maximum Subsequence Value


题目大意:有点难解释。。建议自己看题。我这里就粗略解释:给定一个数组 a a a,要求选出具有最大价值的子序列。假设此子序列的长度为 k k k,那么最大价值的计算方法为:对于这个序列中的所有数的二进制表示,第 i (从0开始)位上是1的数的数量若大于等 m a x ( k − 2 , 1 ) max(k - 2, 1) max(k2,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+....+2k1所以我们要保证最高位的i是有贡献的。通过上面的 s u m i > = m a x ( k − 2 , 1 ) sum_i>=max(k-2,1) sumi>=max(k2,1)我们可以知道 最 多 2 个 0 , 最 少 1 个 1 最多2个0,最少1个1 2011
我们假设我们刚好选了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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值