博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ural2110 : Remove or Maximize
阅读量:6293 次
发布时间:2019-06-22

本文共 899 字,大约阅读时间需要 2 分钟。

设最大的数为$w$,若$n>k+\log w$,那么显然所有$1$都可以保留,否则现在$n\leq k+\log w$。

如果$w\leq 100000$,那么可以DP,设$f[i][j]$表示考虑前$i$个数,保留的数的$or$是$j$时,最多能删除多少个数,时间复杂度$O(nw)$。

如果$w>100000$,那么$k\leq 7$,爆搜即可,时间复杂度$O(C(n,k))$。

 

#include
#include
using namespace std;const int N=100010;int n,m,i,j,o,ans,mx,f[2][131100],a[N];void dfs(int x,int y,int z){ if(y+n-x+1
n){ ans=max(ans,z); return; } dfs(x+1,y,z|a[x]); if(y
m+31){ for(i=1;i<=n;i++)ans|=a[i]; return printf("%d",ans),0; } if(mx<=100000){ for(i=0;i<131072;i++)f[0][i]=-N; f[0][0]=0; for(i=o=1;i<=n;i++,o^=1){ for(j=0;j<131072;j++)f[o][j]=f[o^1][j]+1; for(j=0;j<131072;j++)if(f[o^1][j]>=0)f[o][j|a[i]]=max(f[o][j|a[i]],f[o^1][j]); } for(i=131071;~i;i--)if(f[o^1][i]>=m)break; return printf("%d",i),0; } dfs(1,0,0); return printf("%d",ans),0;}

  

转载地址:http://gapta.baihongyu.com/

你可能感兴趣的文章
SVN 命令笔记
查看>>
检验手机号码
查看>>
重叠(Overlapped)IO模型
查看>>
Git使用教程
查看>>
使用shell脚本自动监控后台进程,并能自动重启
查看>>
Flex&Bison手册
查看>>
solrCloud+tomcat+zookeeper集群配置
查看>>
/etc/fstab,/etc/mtab,和 /proc/mounts
查看>>
Apache kafka 简介
查看>>
socket通信Demo
查看>>
技术人员的焦虑
查看>>
js 判断整数
查看>>
mongodb $exists
查看>>
js实现页面跳转的几种方式
查看>>
sbt笔记一 hello-sbt
查看>>
常用链接
查看>>
pitfall override private method
查看>>
!important 和 * ----hack
查看>>
聊天界面图文混排
查看>>
控件的拖动
查看>>