[bzoj4976][dp]宝石镶嵌
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]宝石镶嵌相关推荐
- 【BZOJ4976】宝石镶嵌 DP
[BZOJ4976]宝石镶嵌 Description 魔法师小Q拥有n个宝石,每个宝石的魔力依次为w_1,w_2,...,w_n.他想把这些宝石镶嵌到自己的法杖上,来提升法杖的威力.不幸的是,小Q的法 ...
- 【bzoj4976】宝石镶嵌(思维dp)
题目传送门:bzoj4976 不得不说这是道脑洞dp,思路真的清奇. 我们可以发现,虽然n很大,但是k只有100,这里面似乎隐藏了什么玄机. 我们可以发现,设总共有$ tot $个二进制位在这n个数中 ...
- 【bzoj4976】宝石镶嵌
题解: 比较水 注意k<=100这个条件 当n-k比较大的时候 我们显然会把它有的位都给取了 不然的话我们可以考虑dp 暴力状压就可以了 代码: #include <bits/stdc++ ...
- bzoj4976宝石镶嵌 DP
Description 魔法师小Q拥有n个宝石,每个宝石的魔力依次为w_1,w_2,-,w_n.他想把这些宝石镶嵌到自己的法杖上,来提升 法杖的威力.不幸的是,小Q的法杖上宝石镶嵌栏太少了,他必须扔掉 ...
- 4976: [Lydsy1708月赛]宝石镶嵌 dp
Description 魔法师小Q拥有n个宝石,每个宝石的魔力依次为w_1,w_2,-,w_n.他想把这些宝石镶嵌到自己的法杖上,来提升 法杖的威力.不幸的是,小Q的法杖上宝石镶嵌栏太少了,他必须扔掉 ...
- BZOJ4976: [Lydsy1708月赛]宝石镶嵌
BZOJ4976: [Lydsy1708月赛]宝石镶嵌 https://lydsy.com/JudgeOnline/problem.php?id=4976 分析: 本来是从\(k\le 100\)这里 ...
- bzoj4976 宝石镶嵌
题目 如果没有k的限制的话,显然全部或起来最大啦. 再想,k多小啊,如果n>=k+20,能有的都可以有,全部或起来就最大啦. 不然,就简单dp一下. #include<bits/stdc+ ...
- BZOJ4976 宝石镶嵌(动态规划)
显然被留下的宝石应该贡献至少一位,否则就可以扔掉.所以如果n-k>=logw,直接输出所有数的or.现在n变得和k同阶了.于是设f[i][j]为前i个数or为j时至少选几个数,转移显然.当然可以 ...
- [bzoj4976]宝石镶嵌
题目大意 给定n个数以及k,要求将n个数去掉k个,剩下的值or起来最大. n≤100000 k≤100 每个数是不大于100000的正整数 分析 假设所有数中总共sum个二进制位出现过1,那么当n-k ...
最新文章
- 详细解析ASP.NET中Request接收参数乱码原理
- python四十:configparse模块
- python爬虫scrapy步骤mac系统_python scrapy简单爬虫记录(实现简单爬取知乎)
- 概述 Linux系统扫描技术及安全防范
- html编辑器linux,HTML 编辑器
- 【转】2.1【MySQL】运行原理(一):查询sql的执行过程及MySQL架构分析
- java poi 水印_poi excel如何设置水印透明度
- windows10 右下角任务栏 隐藏图标
- learning scala type alise
- Network Stack Specialization for Performance
- 【180929】数字拼图游戏源码
- 服务器端安装conda | 配置conda环境
- markdown中编辑数学公式用到的技巧
- Matlab查看矩阵中包含的所有数字种类
- 李宁Matplotlib视频课程作业
- 【新观点】孙悟空其实是太上老君炼的丹药变成的
- python零基础入门最简洁版
- Problem F: 凹凸四边形
- 西南大学计算机研究生就业好嘛,西南大学2018毕业生就业结果:就业率为 89.45%,最高月薪7600...
- 上海交大计算机科学与工程,上海交通大学计算机科学与工程系(CSE)
热门文章
- LabVIEW编程LabVIEW控制研华PCI-1710例程与相关资料
- 电脑C盘快满了有什么影响
- 分析暴力的满天发红包~【方便虽好,安全第一~】
- php一句话木马下载,零魂PHP一句话木马客户端(一键提交版)
- 服务器修改拔刀剑修改数,关于拔刀剑的(求助大佬!)
- 笔记本Ubuntu18.04-盒盖休眠解决办法
- Go语言实践[回顾]教程03--Go语言的编译与运行的命令行
- 推荐一个shell语法在线检查网站,也可以学习shell语法
- linux 安装 php curl扩展,linux下安装php的curl扩展
- Python实现圆环面积求解