Description

魔法师小Q拥有n个宝石,每个宝石的魔力依次为w_1,w_2,...,w_n。他想把这些宝石镶嵌到自己的法杖上,来提升
法杖的威力。不幸的是,小Q的法杖上宝石镶嵌栏太少了,他必须扔掉k个宝石才能将剩下的宝石镶嵌上去。法杖的
威力等于镶嵌在上面的所有宝石的魔力按位做或(OR)运算的结果,请写一个程序帮助小Q做出最佳的选择,使得法
杖的威力最大。

Input


第一行包含两个正整数n,k(2<=n<=100000,1<=k<=100,k<n),分别表示宝石的个数以及要扔掉的宝石个数。
第二行包含n个整数w_1,w_2,...,w_n(0<=w_i<=100000),分别表示每个宝石的魔力。

Output

输出一行一个整数,即最大的威力。

Sample Input

4 1
32 16 8 7

Sample Output

56

题解

很神奇的一道题
首先观察魔力的大小,每个魔力大小不超过100000,那么最大的魔力值一定不会超过2^17次方。
那么先寻找每个数能贡献值的位置,假如贡献的位置多于n-k的话,那么可以直接输出了
不行的话,n-k就只可能小于17了,也就是n<117
那么采取dp做
设f[i][j]为前i个数,或的和为j,最多需要删除多少个数
dp方程看代码吧
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAXN=(1<<17);
int a[MAXN],n,k,cnt;
bool wz[20];//wz[i]=true表示i位置可以|一个1
int f[120][MAXN];//只需处理n<117的情况
int main()
{memset(wz,false,sizeof(wz));cnt=0;scanf("%d%d",&n,&k);for(int i=1;i<=n;i++){scanf("%d",&a[i]);for(int j=0;j<17;j++)if((a[i]&(1<<j))>0)wz[j]=true;}int ans=0;for(int i=0;i<17;i++)if(wz[i]==true){cnt++;ans|=(1<<i);}if(n-k>=cnt){printf("%d\n",ans);return 0;}for(int i=0;i<=n;i++)for(int j=0;j<MAXN;j++)f[i][j]=-n;f[0][0]=0;for(int i=1;i<=n;i++){for(int j=0;j<MAXN;j++){f[i][j]=max(f[i][j],f[i-1][j]+1);//a[i]不参与| 那么删除的数就要+1f[i][j|a[i]]=max(f[i][j|a[i]],f[i-1][j]);//a[i]参与| 删除的数就不动 }}for(int i=1;i<MAXN;i++)if(f[n][i]>=k)ans=i;printf("%d\n",ans);return 0;
}

[bzoj4976][dp]宝石镶嵌相关推荐

  1. 【BZOJ4976】宝石镶嵌 DP

    [BZOJ4976]宝石镶嵌 Description 魔法师小Q拥有n个宝石,每个宝石的魔力依次为w_1,w_2,...,w_n.他想把这些宝石镶嵌到自己的法杖上,来提升法杖的威力.不幸的是,小Q的法 ...

  2. 【bzoj4976】宝石镶嵌(思维dp)

    题目传送门:bzoj4976 不得不说这是道脑洞dp,思路真的清奇. 我们可以发现,虽然n很大,但是k只有100,这里面似乎隐藏了什么玄机. 我们可以发现,设总共有$ tot $个二进制位在这n个数中 ...

  3. 【bzoj4976】宝石镶嵌

    题解: 比较水 注意k<=100这个条件 当n-k比较大的时候 我们显然会把它有的位都给取了 不然的话我们可以考虑dp 暴力状压就可以了 代码: #include <bits/stdc++ ...

  4. bzoj4976宝石镶嵌 DP

    Description 魔法师小Q拥有n个宝石,每个宝石的魔力依次为w_1,w_2,-,w_n.他想把这些宝石镶嵌到自己的法杖上,来提升 法杖的威力.不幸的是,小Q的法杖上宝石镶嵌栏太少了,他必须扔掉 ...

  5. 4976: [Lydsy1708月赛]宝石镶嵌 dp

    Description 魔法师小Q拥有n个宝石,每个宝石的魔力依次为w_1,w_2,-,w_n.他想把这些宝石镶嵌到自己的法杖上,来提升 法杖的威力.不幸的是,小Q的法杖上宝石镶嵌栏太少了,他必须扔掉 ...

  6. BZOJ4976: [Lydsy1708月赛]宝石镶嵌

    BZOJ4976: [Lydsy1708月赛]宝石镶嵌 https://lydsy.com/JudgeOnline/problem.php?id=4976 分析: 本来是从\(k\le 100\)这里 ...

  7. bzoj4976 宝石镶嵌

    题目 如果没有k的限制的话,显然全部或起来最大啦. 再想,k多小啊,如果n>=k+20,能有的都可以有,全部或起来就最大啦. 不然,就简单dp一下. #include<bits/stdc+ ...

  8. BZOJ4976 宝石镶嵌(动态规划)

    显然被留下的宝石应该贡献至少一位,否则就可以扔掉.所以如果n-k>=logw,直接输出所有数的or.现在n变得和k同阶了.于是设f[i][j]为前i个数or为j时至少选几个数,转移显然.当然可以 ...

  9. [bzoj4976]宝石镶嵌

    题目大意 给定n个数以及k,要求将n个数去掉k个,剩下的值or起来最大. n≤100000 k≤100 每个数是不大于100000的正整数 分析 假设所有数中总共sum个二进制位出现过1,那么当n-k ...

最新文章

  1. 详细解析ASP.NET中Request接收参数乱码原理
  2. python四十:configparse模块
  3. python爬虫scrapy步骤mac系统_python scrapy简单爬虫记录(实现简单爬取知乎)
  4. 概述 Linux系统扫描技术及安全防范
  5. html编辑器linux,HTML 编辑器
  6. 【转】2.1【MySQL】运行原理(一):查询sql的执行过程及MySQL架构分析
  7. java poi 水印_poi excel如何设置水印透明度
  8. windows10 右下角任务栏 隐藏图标
  9. learning scala type alise
  10. Network Stack Specialization for Performance
  11. 【180929】数字拼图游戏源码
  12. 服务器端安装conda | 配置conda环境
  13. markdown中编辑数学公式用到的技巧
  14. Matlab查看矩阵中包含的所有数字种类
  15. 李宁Matplotlib视频课程作业
  16. 【新观点】孙悟空其实是太上老君炼的丹药变成的
  17. python零基础入门最简洁版
  18. Problem F: 凹凸四边形
  19. 西南大学计算机研究生就业好嘛,西南大学2018毕业生就业结果:就业率为 89.45%,最高月薪7600...
  20. 上海交大计算机科学与工程,上海交通大学计算机科学与工程系(CSE)

热门文章

  1. LabVIEW编程LabVIEW控制研华PCI-1710例程与相关资料
  2. 电脑C盘快满了有什么影响
  3. 分析暴力的满天发红包~【方便虽好,安全第一~】
  4. php一句话木马下载,零魂PHP一句话木马客户端(一键提交版)
  5. 服务器修改拔刀剑修改数,关于拔刀剑的(求助大佬!)
  6. 笔记本Ubuntu18.04-盒盖休眠解决办法
  7. Go语言实践[回顾]教程03--Go语言的编译与运行的命令行
  8. 推荐一个shell语法在线检查网站,也可以学习shell语法
  9. linux 安装 php curl扩展,linux下安装php的curl扩展
  10. Python实现圆环面积求解