BZOJ 4976 [Lydsy1708月赛]宝石镶嵌

2023-10-21 15:20

本文主要是介绍BZOJ 4976 [Lydsy1708月赛]宝石镶嵌,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【题解】

  我们设总共有m个二进制位出现过1,那么如果n-k≥m,显然所有的1都可以出现,那么答案就是把所有的数或起来。

  如果n-k<m,那么因为k不超过100,ai不超过1e5,所以n不超过117,直接n*1e5的Dp即可。

  Dp的方式也是多种多样,如果设f[i][j]表示前i个数字或出j最少需要几个数字,那么转移方程为f[i][j|a[i]]=min(f[i-1][j|a[i]],f[i-1][j]+1]).

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define LL long long
 5 #define rg register
 6 #define N 131072
 7 using namespace std;
 8 int n,m,k,sum,ans,a[N],f[120][N];
 9 inline int read(){
10     int k=0,f=1; char c=getchar();
11     while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
12     while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
13     return k*f;
14 }
15 int main(){
16     n=read(); k=read();
17     for(rg int i=1;i<=n;i++) a[i]=read(),sum|=a[i];
18     int x=sum;
19     for(rg int i=16;i;i--)if(x>=(1<<i)) m++,x-=(1<<i);
20     if(n-k>=m) printf("%d\n",sum);
21     else{
22         for(rg int i=0;i<=n;i++)
23             for(rg int j=0;j<N;j++) f[i][j]=n;
24         f[0][0]=0;
25         for(rg int i=1;i<=n;i++) {
26             for(rg int j=0;j<N;j++)
27             f[i][j|a[i]]=min(f[i][j|a[i]],f[i-1][j]+1); 
28             for (rg int j=0;j<N;j++)
29             f[i][j]=min(f[i][j],f[i-1][j]);
30         }
31         for(rg int i=0;i<N;i++) if(f[n][i]<=n-k) ans=i;
32         printf("%d\n",ans);
33     }
34     return 0;
35 }
View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define LL long long
 5 #define rg register
 6 #define N 131072
 7 using namespace std;
 8 int n,m,k,sum,ans,a[N],f[120][N];
 9 inline int read(){
10     int k=0,f=1; char c=getchar();
11     while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
12     while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
13     return k*f;
14 }
15 int main(){
16     n=read(); k=read();
17     for(rg int i=1;i<=n;i++) a[i]=read(),sum|=a[i];
18     int x=sum;
19     for(rg int i=16;i;i--)if(x>=(1<<i)) m++,x-=(1<<i);
20 //    printf("%d %d\n",m,sum);
21     if(n-k>=m) printf("%d\n",sum);
22     else{
23         for(rg int i=0;i<=n;i++)
24             for(rg int j=0;j<N;j++) f[i][j]=-n;
25         f[0][0]=0;
26         for(rg int i=1;i<=n;i++)
27             for(rg int j=0;j<N;j++)
28                 f[i][j]=max(f[i][j],f[i-1][j]+1),
29                 f[i][j|a[i]]=max(f[i][j|a[i]],f[i-1][j]);
30         for(rg int i=1;i<N;i++) if(f[n][i]>=k) ans=i;
31         printf("%d\n",ans);
32     }
33     return 0;
34 }
View Code

 

转载于:https://www.cnblogs.com/DriverLao/p/9761427.html

这篇关于BZOJ 4976 [Lydsy1708月赛]宝石镶嵌的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/255246

相关文章

【BZOJ】1324 Exca王者之剑 最大权独立集

传送门:【BZOJ】1324  Exca王者之剑 题目分析:赤裸裸的最大权独立集。。。最小割解决 代码如下: #include <cstdio>#include <vector>#include <cstring>#include <algorithm>using namespace std ;#define REP( i , a , b ) for ( int

【BZOJ】1026: [SCOI2009]windy数 数位DP

传送门:【BZOJ】1026: [SCOI2009]windy数 题目分析:数位DP水题。 代码如下: #include <stdio.h>#include <cstring>#include <algorithm>#define rep( i , a , b ) for ( int i = a ; i < b ; ++ i )#define For( i ,

【BZOJ】2152: 聪聪可可 点分治

传送门:【BZOJ】2152: 聪聪可可 题目分析:记录权值和%3的路径的个数。。。然后去重。。没了。。 代码如下: #include <vector>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std ;typedef lo

B3918 [语言月赛 202401] 图像变换

[题目通道]([语言月赛 202401] 图像变换 - 洛谷) #include<bits/stdc++.h>using namespace std;int n,m,k;string a[1000],st;int main(){cin>>n>>m>>k;for (int i=1;i<=n;i++){cin>>a[i];}for (int i=1;i<=n;i++){st="";for (

算法---------宝石与石头

题目: 给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。J 中的字母不重复,J 和 S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。示例 1:输入: J = "aA", S = "aAAbbbb"输出: 3示例 2:输入: J = "z", S = "ZZ"输出:

dp FOJ 一月月赛C ytaaa

Accept: 57    Submit: 261 Time Limit: 2000 mSec    Memory Limit : 32768 KB  Problem Description Ytaaa作为一名特工执行了无数困难的任务,这一次ytaaa收到命令,需要炸毁敌人的一个工厂,为此ytaaa需要制造一批炸弹以供使用。 Ytaaa使用的这种新型炸弹由若干个炸药组成,每个炸药都有

BZOJ 2440 2301 莫比乌斯应用

http://www.lydsy.com/JudgeOnline/problem.php?id=2440 Description 小 X 自幼就很喜欢数。但奇怪的是,他十分讨厌完全平方数。他觉得这些 数看起来很令人难受。由此,他也讨厌所有是完全平方数的正整数倍的数。然而 这丝毫不影响他对其他数的热爱。  这天是小X的生日,小 W 想送一个数给他作为生日礼物。当然他不能送一 个小X讨厌

BZOJ 3732: Network(最小生成树+倍增)

题目链接 题意:给出一个图,每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少 很明显最终查询的边一定是在最小生成树里面的,先跑出最小生成树,然后,可以树链剖分,也可以使用倍增来计算 #include<bits/stdc++.h>using namespace std;#define cl(a,b) memset(a,b,sizeof(a))#define

大二第二次月赛--手速

手速 时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 1 描述 被学长虐了之后,wyl 认识到了手速的重要性,yy了一道。 初始化序列为空 给 n 个操作: 0 :    从头部往里放 1 :    从尾部往里放 2 :      从头部删除 3 :      从尾部删除 4:    改变功能,原来是从头部放的从尾部放,从尾部放的从头部放,删除也是如此

BZOJ 2038 小Z的袜子(hose) (莫队离线)

题目地址:BZOJ 2038 裸的莫队算法。 代码如下: #include <iostream>#include <string.h>#include <math.h>#include <queue>#include <algorithm>#include <stdlib.h>#include <map>#include <set>#include <stdio.h>#in