题目传送门:bzoj4976

  不得不说这是道脑洞dp,思路真的清奇。

  我们可以发现,虽然n很大,但是k只有100,这里面似乎隐藏了什么玄机。

  我们可以发现,设总共有$ tot $个二进制位在这n个数中有出现过1,那么当$ n-k>=tot $时,所有二进制位都能取到,可以直接计算答案。

  当$ n-k<tot $时,n最大只有116(因为宝石价值最大只有1e5<2^17),那么就可以随便dp一下:设$ f[i][j] $表示处理前$ i $个数,当前或运算结果为$ j $时,最多能选取多少个数,那么就可以得到:$ f[i][j|w[i]]=max(f[i][j|w[i]],f[i-1][j]+1) $

  代码:

#include<cstdio>
#include<algorithm>
#include<queue>
#define maxn 100010
int a[maxn],f[180010];
int n,k;
inline char nc(){static char buf[100000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline void read(int &x)
{x=0; char c=nc();for(;c<'0'||'9'<c;c=nc());for(;'0'<=c&&c<='9';c=nc())x=(x<<3)+(x<<1)+c-'0';
}
int main()
{read(n); read(k);int mx=0;for(int i=1;i<=n;i++){read(a[i]);if(a[i]>mx)mx=a[i];}int tot=0,tmp=0,hhh=0;for(int i=1;i<=mx;i<<=1,++hhh){int flag=0;for(int j=1;j<=n;j++)if(a[j]&i){flag=1; break;}if(flag)++tot,tmp|=i;}if(n-k>=tot){printf("%d\n",tmp); return 0;}for(int i=0;i<(1<<hhh);i++)f[i]=0x3f3f3f3f; f[0]=0;for(int i=1;i<=n;i++)for(int j=(1<<hhh)-1;j>=0;j--)if(f[j]+1<f[j|a[i]])f[j|a[i]]=f[j]+1;int ans=0;for(int i=0;i<(1<<hhh);i++)if(f[i]+k<=n&&ans<i)ans=i;printf("%d\n",ans);
}

bzoj4976

转载于:https://www.cnblogs.com/quzhizhou/p/10078815.html

【bzoj4976】宝石镶嵌(思维dp)相关推荐

  1. bzoj4976宝石镶嵌 DP

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

  2. CodeForces - 1353E K-periodic Garland(思维+dp)

    题目链接:点击查看 题目大意:给出 n 个灯泡以及其初始状态(开或关),每次操作可以将任意一个灯泡的状态置反,问最少需要操作多少次,可以使得所有开着的灯泡之间相距 k 个单位 题目分析:因为需要满足所 ...

  3. 思维dp ---- Codeforces Round #142 (Div. 1) D. Towers

    题目链接 题目大意: 你可以把第iii座塔和i+1i+1i+1座或i−1i-1i−1座合并成一个 使得到的那座塔的高度是原来两座塔的和 问最使序列变成严格不增最小合并次数 解题思路: 首先我想到的是贪 ...

  4. 思维dp ---- CF41D Pawn [可达状态统计dp]

    题目链接 题目大意: 解题思路: 如果没有 k+1∣∑wk+1|\sum wk+1∣∑w 的限制的话就是个简单的 dp dp[i][j]=max(dp[i+1][j−1],dp[i+1][j+1])d ...

  5. 思维dp ---- 复杂状态找中间状态作为dp状态 1552F - Telepanting

    题目链接 题目大意: 有个蚂蚁从000号点要到xn+1x_n+1xn​+1的位置. 在x0,x1,x2,x3,.....,xn+1,xnx_0,x_1,x_2,x_3,.....,x_{n+1},x_ ...

  6. 思维dp ---- K步最短路 D. Explorer Space

    题目链接 解题思路: 这题目本质就是求K/2步最短路然后乘以2就可以了因为要回去嘛 如何求k/2步最短路呢? 就是我们dp[k][i][j]dp[k][i][j]dp[k][i][j]求的是kkk步到 ...

  7. 思维dp ---- Codeforces Round #722 (Div. 1) B. Kavi on Pairing Duty [思维dp + 数学]

    题目大意: 将2n2n2n个点两两相连形成n对,对于任意两个点对A和B,要求至少满足其中一条: 1.A和B的某一个完全包含于另一个中 2.A和B的长度相等.问你一共有多少种方案. 解题思路: 题解:假 ...

  8. D.Digits 思维dp 取log乘积变成加法

    题目链接 题目大意: 就是给你nnn个数和一个数字ddd,问你从这n个数中挑出若干个数,使得这些数的乘积最后的一个数字是d,并且结果是最大的,问你要挑出哪些数字? n∈[1,1e5],ai∈[1,10 ...

  9. 思维dp ---- Codeforces Round #711 (Div. 2) - C. Planar Reflections[dp/记忆化搜索]

    题目链接 题目大意: 就是给你n个平面和一个寿命为k的衰变粒子.开始粒子从左向右飞行,粒子每经过一个平面就会产生一个副本粒子,这个副本粒子比原粒子的寿命少1,即为k-1,并且飞行方向是原粒子的反方向. ...

最新文章

  1. tkinter学习-菜单与画布
  2. 使用Java和JCEKS进行AES-256加密
  3. Serverless 实战 —— Serverless 架构揭秘与静态网站部署实战
  4. 用java解决约瑟夫循环问题,Java实现循环列表解决约瑟夫环问题
  5. spring import resource 文件后bean找不到问题解决
  6. 喜欢独自喝茶的人是什么样的人
  7. ThinkPHP5 笔记-控制器
  8. Vite ---- 创建Vue3.0+TS项目
  9. SpreadJS:一款类Excel开发工具,功能涵盖Excel的 95% 以上
  10. 交互式绘图软件源码开发,简单好用功能强大的绘图工具
  11. SCI论文配色-matplotlib分类柱状图绘制
  12. win10系统镜像下载及在VMware虚拟机上创建win10虚拟机
  13. 中文模糊查找(C语言)+ 链表操作
  14. Object-Oriented Programming Summary Ⅲ
  15. bzoj3029 守卫者的挑战
  16. html5绘制矩形动画,HTML5 Canvas中绘制矩形实例
  17. Mysql——》查看数据库表结构
  18. mysql insert 返回值是什么_各种SQL Insert 返回值
  19. 第三章:期货合约与期货交易制度
  20. 我也说说Emacs吧(1) - Emacs和Vi我们都学

热门文章

  1. 学生成绩包括平时成绩和考核成绩,总评成绩=平时成绩*50%+考核成绩*50%,每个学生都可以按照“姓名:平时成绩 总评成绩”的格式显示自己的信息。
  2. 除了人生与目标,扎克伯格演讲的背后还有这些“有趣”东西
  3. 信捷 XDH Ethercat A_FOLLOW指令
  4. Java工具类-生成随机汉字和名称
  5. cocos creator 打包 后屏闪、闪烁问题
  6. 捣蛋猪(Bad Piggies) 1.3.0 PC 版免注册补丁
  7. 查看服务器CPU内存
  8. flash上传网站大全
  9. php 二维排序函数,PHP二维数组排序函数
  10. traceroute用法与原理分析