您的位置:首页 > 其它

bzoj 4976: 宝石镶嵌

2017-09-19 22:19 176 查看
题意:n个数,去掉k个,使剩下的数的or和最大。

题解:

设a是w的最大值。分两种情况:1:n-k>=log a,每一位就一定可以选一个数来补上(除非所有都没有这一位)。2:n-k< log a,dp,f[i][j]表示前i个数or和为j最多去掉几个数。

代码:

#include<bits/stdc++.h>
using namespace std;

int n,k,w[100010],f[120][131072];

int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&w[i]);
sort(w+1,w+1+n);
if(n-k>=20)
{
int ans=0;
for(int i=0;i<20;i++)
{
for(int j=1;j<=n;j++)
if(w[j]>>i&1)
{
ans|=w[j];
break;
}
}
printf("%d",ans);
}
else
{
memset(f,128,sizeof(f));
f[0][0]=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<131072;j++)
{
f[i][j]=max(f[i][j],f[i-1][j]+1);
f[i][j|w[i]]=max(f[i][j|w[i]],f[i-1][j]);
}
}
for(int i=131071;i>=0;i--)
if(f
[i]>=k)
{
printf("%d",i);
break;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: