【bzoj4976】宝石镶嵌(思维dp)
题目传送门: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[];
int n,k;
inline char nc(){
static char buf[],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,,,stdin),p1==p2)?EOF:*p1++;
}
inline void read(int &x)
{
x=; char c=nc();
for(;c<''||''<c;c=nc());
for(;''<=c&&c<='';c=nc())x=(x<<)+(x<<)+c-'';
}
int main()
{
read(n); read(k);
int mx=;
for(int i=;i<=n;i++){
read(a[i]);
if(a[i]>mx)mx=a[i];
}
int tot=,tmp=,hhh=;
for(int i=;i<=mx;i<<=,++hhh){
int flag=;
for(int j=;j<=n;j++)
if(a[j]&i){
flag=; break;
}
if(flag)++tot,tmp|=i;
}
if(n-k>=tot){
printf("%d\n",tmp); return ;
}
for(int i=;i<(<<hhh);i++)f[i]=0x3f3f3f3f; f[]=;
for(int i=;i<=n;i++)
for(int j=(<<hhh)-;j>=;j--)
if(f[j]+<f[j|a[i]])f[j|a[i]]=f[j]+;
int ans=;
for(int i=;i<(<<hhh);i++)
if(f[i]+k<=n&&ans<i)ans=i;
printf("%d\n",ans);
}
bzoj4976
【bzoj4976】宝石镶嵌(思维dp)的更多相关文章
- BZOJ4976:宝石镶嵌(DP&思维)
Description 魔法师小Q拥有n个宝石,每个宝石的魔力依次为w_1,w_2,...,w_n.他想把这些宝石镶嵌到自己的法杖上,来提升 法杖的威力.不幸的是,小Q的法杖上宝石镶嵌栏太少了,他必须 ...
- T2960 全民健身【思维Dp,预处理,差分优化】
Online Judge:YCJSOI Label:Dp,思维题,预处理,滚动优化 题目描述 乐乐现在掌管一个大公司,办公楼共有n层.为了增加员工的身体素质,他决定在每层楼都建立一个活动室,活动室分乒 ...
- 【做题】CSA49F - Card Collecting Game——思维&dp
原文链接 https://www.cnblogs.com/cly-none/p/CSA49F.html 题意:Alice和Bob在玩游戏.有\(n\)种卡牌,每种卡牌有\(b_i\)张,保证\(\su ...
- 牛客练习赛40 A 小D的剧场 (思维dp)
链接:https://ac.nowcoder.com/acm/contest/369/A 题目描述 若你摘得小的星星 你将得到小的幸福 若你摘得大的星星 你将得到大的财富 若两者都能摘得 你将得到 ...
- Codeforces Round #533 (Div. 2) C.思维dp D. 多源BFS
题目链接:https://codeforces.com/contest/1105 C. Ayoub and Lost Array 题目大意:一个长度为n的数组,数组的元素都在[L,R]之间,并且数组全 ...
- Queue CodeForces - 353D (思维dp)
https://codeforces.com/problemset/problem/353/D 大意:给定字符串, 每一秒, 若F在M的右侧, 则交换M与F, 求多少秒后F全在M左侧 $dp[i]$为 ...
- codeforce——思维dp
Codeforces 822C Hacker, pack your bags!(思维) 题目大意:给你n个旅券,上面有开始时间l,结束时间r,和花费cost,要求选择两张时间不相交的旅券时间长度相 ...
- BZOJ4976 宝石镶嵌(动态规划)
显然被留下的宝石应该贡献至少一位,否则就可以扔掉.所以如果n-k>=logw,直接输出所有数的or.现在n变得和k同阶了.于是设f[i][j]为前i个数or为j时至少选几个数,转移显然.当然可以 ...
- atcoder 2017Code festival C ——D题 Yet Another Palindrome Partitioning(思维+dp)
题目大意: 把一个字符串s分割成m个串,这m个串满足至多有一种字符出现次数为奇数次,其他均为偶数次,问m的最小值 题解: 首先我们想一下纯暴力怎么做 显然是可以n^2暴力的,然后dp[i]表示分割到i ...
随机推荐
- 删除Android自带的系统软件注意事项
教程类 知识分享 [转]好多童鞋在ROOT手机后,大刀阔斧的就开始砍系统里面的东西,有些事删不得的,删除错了就成砖头了! 以下是对照表: 注意:打*号的千万别删,打-号的是建议删的(大多要穿墙才能 ...
- Python中的推导式(列表推导式、字典推导式、集合推导式)
推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体. 共有三种推导,在Python2和3中都有支持: 列表(lis ...
- Mad Counting---LightOJ1148(好任性的过了)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1148 已知有n个人,并且每个人都知道除自己之外还有m个人与自己支持的队一样,让我们求至 ...
- windows系统的对象管理
windows中的对象和高级编程语言中所说的对象还欧区别,准确来讲,windows中的对象其实指的是一种数据结构并且是一种带着“对象头(object head)” 的数据结构! 所以windows中 ...
- mysql删除重复数据,保留最新的那一条
因为数据库没键外键,在关联查询的时候,会碰到查询条数多余数据库实际条数,这因为关联字段在表中有重复值而导致的. 解决方案: 1.数据库脚本删除重复数据,保留最新的一条 2.对关联字段增加唯一约束 例如 ...
- thinkphp curd的事务回滚 一看就会
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qq1355541448/article/details/32314403 /** ...
- Visual Studio 起始页面关闭新闻等
[工具]->[选项]->[环境]->[启动] 将“下载内容的时间间隔”一项的勾选去掉,然后确定保存.这样,就大功告成啦
- 把typora改为微软雅黑+Consolas
前言 typora是一款非常方便的书写markdown文本的编辑器.官网:https://www.typora.io/ 对于字体强迫症患者来说,不把字体改成微软雅黑+Consolas,那是相当难受.本 ...
- Java CodeFormatter
设置Formatter模板的入口: Window->Preference->Java->Code Style->Code Formatter <?xml version= ...
- matplotlib的一些代码
Matplotlib Python 画图教程 (莫烦Python)_演讲•公开课_科技_bilibili_哔哩哔哩 https://www.bilibili.com/video/av16378354/ ...