题目传送门: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)的更多相关文章

  1. BZOJ4976:宝石镶嵌(DP&思维)

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

  2. T2960 全民健身【思维Dp,预处理,差分优化】

    Online Judge:YCJSOI Label:Dp,思维题,预处理,滚动优化 题目描述 乐乐现在掌管一个大公司,办公楼共有n层.为了增加员工的身体素质,他决定在每层楼都建立一个活动室,活动室分乒 ...

  3. 【做题】CSA49F - Card Collecting Game——思维&dp

    原文链接 https://www.cnblogs.com/cly-none/p/CSA49F.html 题意:Alice和Bob在玩游戏.有\(n\)种卡牌,每种卡牌有\(b_i\)张,保证\(\su ...

  4. 牛客练习赛40 A 小D的剧场 (思维dp)

    链接:https://ac.nowcoder.com/acm/contest/369/A 题目描述 若你摘得小的星星 你将得到小的幸福  若你摘得大的星星 你将得到大的财富  若两者都能摘得 你将得到 ...

  5. Codeforces Round #533 (Div. 2) C.思维dp D. 多源BFS

    题目链接:https://codeforces.com/contest/1105 C. Ayoub and Lost Array 题目大意:一个长度为n的数组,数组的元素都在[L,R]之间,并且数组全 ...

  6. Queue CodeForces - 353D (思维dp)

    https://codeforces.com/problemset/problem/353/D 大意:给定字符串, 每一秒, 若F在M的右侧, 则交换M与F, 求多少秒后F全在M左侧 $dp[i]$为 ...

  7. codeforce——思维dp

    Codeforces 822C Hacker, pack your bags!(思维)   题目大意:给你n个旅券,上面有开始时间l,结束时间r,和花费cost,要求选择两张时间不相交的旅券时间长度相 ...

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

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

  9. atcoder 2017Code festival C ——D题 Yet Another Palindrome Partitioning(思维+dp)

    题目大意: 把一个字符串s分割成m个串,这m个串满足至多有一种字符出现次数为奇数次,其他均为偶数次,问m的最小值 题解: 首先我们想一下纯暴力怎么做 显然是可以n^2暴力的,然后dp[i]表示分割到i ...

随机推荐

  1. JS之for...in和for...of

    for...in输入键: for...in循环有几个缺点. 数组的键名是数字,但是for...in循环是以字符串作为键名“0”.“1”.“2”等等. for...in循环不仅遍历数字键名,还会遍历手动 ...

  2. webpack打包页面空白的解决方法

  3. 永远也记不住的linux环境变量,库文件,头文件,交叉编译...

    一.环境变量1.node-v4.9.1-linux-armv7l1)安装cp node-v4.9.1-linux-armv7l.tar.gz /usr/local/cd /usr/local/tar ...

  4. ActiveMQ简单入门

    一.创建一个简单的Hello World案例 首先需要导入activemq-all-5.14.5.jar包,写生产端: package com.ietree.mq.helloworld; import ...

  5. xe7开发的安卓程序,体积宏大--112M!

    原因没找到,但似乎可以这样解决: 解决过程:因为代码很少,所以我重新建立一个空白程序,把代码复制过去,一字不差.重新编译, 关键的时刻到了:不要连上真机,在编译完成时,系统提示是否要启动android ...

  6. java获得两个日期之间的所有月份

    private static List<String> getMonthBetween(String minDate, String maxDate) throws ParseExcept ...

  7. oracle中修改表已有数据的某一列的字段类型的方法,数据备份

    1.在开发过程中经常会遇到表中的某一个字段数据类型不对,比如说需要保存的数据带小数,但是在最初设计的时候是给的number(10)类型,开始保存是整数的时候满足要求,后来在保存小数的时候 会发现自动四 ...

  8. SQL.Mysql中Cast()函数的用法

    比起orcale,MySQL相比之下就简单得多了,只需要一个Cast()函数就能搞定.其语法为:Cast(字段名 as 转换的类型 ),其中类型可以为: CHAR[(N)] 字符型  DATE  日期 ...

  9. CentOS6.5安装Qt4.8.6+QtCreator2.6.1

    工作中需要用到Qt在Linux下做开发,公司提供的电脑安装的CentOS6.2,但是为了和windows下自己使用的QT版本一直,于是也选择安装了Qt5.1.0.但是在CentOS下刚开始是无法启动, ...

  10. Centos75 解决Nginx出现403 forbidden(13: Permission denied)

    Centos75 新安装的vm,nginx出现403 forbidden 一般为SELinux设置为开启状态(enabled)的原因 切为root ,执行: sed -i 's/SELINUX=enf ...