题目链接


Solution

Meet in the middle.

考虑到 \(2^{35}\) 枚举会超时,于是分成两半枚举(尽量平均).

然后不能 \(n^2\) 去匹配,需要用到一点贪心:

将数分成 \(p,q\) 两组,那么对于任意数 \(p_i\) ;

它与 \(q\) 数组中组成最大得到的值即为

最大的与 \(p_i\) 之和不超过\(m\) 的数.

然后就可以贪心优化了.

还要注意一点就是最大的两个也要考虑一次.

Code

#include<bits/stdc++.h>
#define N 1<<20
#define ll long long
using namespace std; ll n,m,w[40],p[N],q[N],ans;
ll cntp,cntq,a[40],b[40]; void dfs1()
{
ll num=(n+1)/2;
for(ll i=0;i<num;i++)a[i]=w[i*2+1];
ll tot=(1<<num)-1;
for(ll i=1;i<=tot;i++)
{
ll Tot=0;
for(ll j=0;j<num;j++)
if((1<<j)&i)
Tot+=a[j],Tot%=m;
p[++cntp]=Tot;
}
} void dfs2()
{
ll num=n/2;
for(ll i=0;i<num;i++)
b[i]=w[(i+1)*2];
ll tot=(1<<num)-1;
for(ll i=1;i<=tot;i++)
{
ll Tot=0;
for(ll j=0;j<num;j++)
if((1<<j)&i)
Tot+=b[j],Tot%=m;
q[++cntq]=Tot;
}
} int main()
{
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++)
scanf("%lld",&w[i]);
sort(w+1,w+n+1);
dfs1(); dfs2();
sort(p+1,p+cntp+1);
sort(q+1,q+cntq+1);
//for(ll i=1;i<=cntp;i++)cout<<p[i]<<' ';cout<<endl;
//for(ll i=1;i<=cntq;i++)cout<<q[i]<<' ';cout<<endl;
int i=0,j=cntq;
while(i<=cntp){
while(p[i]+q[j]>=m) --j;
ans=max(ans,p[i]+q[j]),++i;
}//贪心优化部分
ans=max(ans,(p[cntp]+q[cntq])%m);
cout<<ans<<endl;
}

CF888E Maximum Subsequence (Meet in the middle,贪心)的更多相关文章

  1. $CF888E\ Maximum\ Subsequence$ 搜索

    正解:$meet\ in\ the\ middle$ 解题报告: 传送门$QwQ$. 发现数据范围为$n\leq 35$,所以$2^{\frac{n}{2}}$是可做的. 所以先拆成$A,B$两个集合 ...

  2. CF888E Maximum Subsequence(meet in the middle)

    给一个数列和m,在数列任选若干个数,使得他们的和对m取模后最大( \(1<=n<=35\) , \(1<=m<=10^{9}\)) 考虑把数列分成两份,两边分别暴力求出所有的可 ...

  3. [CF888E] Maximum Subsequence 序列分治

    早期作品,不喜轻喷. LG传送门 序列分治板子题. 切这道题用了好长时间,所以想发篇题解作为纪念 . 首先,我们认真观察题目数据(面向数据做题是个好习惯),发现题目的\(n\)竟然只有\(35\),我 ...

  4. 【CF888E】Maximum Subsequence(meet in the middle)

    [CF888E]Maximum Subsequence(meet in the middle) 题面 CF 洛谷 题解 把所有数分一下,然后\(meet\ in\ the\ middle\)做就好了. ...

  5. 【CF888E】Maximum Subsequence 折半搜索

    [CF888E]Maximum Subsequence 题意:给你一个序列{ai},让你从中选出一个子序列,使得序列和%m最大. n<=35,m<=10^9 题解:不小心瞟了一眼tag就一 ...

  6. Codeforces Round #648 (Div. 2) E. Maximum Subsequence Value 贪心

    题意:E.Maximum Subsequence Value 题意: 给你n 个元素,你挑选k个元素,那么这个 k 集合的值为 ∑2i,其中,若集合内至少有 max(1,k−2)个数二进制下第 i 位 ...

  7. Meet in the middle学习笔记

    Meet in the middle(MITM) Tags:搜索 作业部落 评论地址 PPT中会讲的很详细 当搜索的各项互不影响(如共\(n\)个物品前\(n/2\)个物品选不选和后\(n/2\)个物 ...

  8. Educational Codeforces Round 32:E. Maximum Subsequence(Meet-in-the-middle)

    题目链接:E. Maximum Subsequence 用了一个Meet-in-the-middle的技巧,还是第一次用到这个技巧,其实这个技巧和二分很像,主要是在dfs中,如果数量减小一半可以节约很 ...

  9. 1007 Maximum Subsequence Sum

    Given a sequence of K integers { N​1​​, N​2​​, ..., N​K​​ }. A continuous subsequence is defined to ...

随机推荐

  1. MySQL(mariadb)主从复制模式与复制过滤

    在前一篇文章<mysql多实例与复制应用>中只对mysql的复制做了简单的介绍,本篇内容专门介绍一下mysql的复制. MySQL复制 mysql复制是指将主数据库的DDL和DML操作通过 ...

  2. 本地通过VMware Workstation创建虚拟机,配置网络环境

    通过VMware Workstation创建虚拟机,系统安装完成后,需要配置相应网卡设置: 打开配置文件:vim /etc/sysconfig/network-scripts/ifcfg-ens33 ...

  3. linux系统的启动过程简要分析

    接触linux系统运维已经好几年了,常常被问到linux系统启动流程问题,刚好今天有空来梳理下这个过程:一般来说,所有的操作系统的启动流程基本就是: 总的来说,linux系统启动流程可以简单总结为以下 ...

  4. 第4章 HDFS操作

    目录 4.1 命令行操作 4.2 Java API操作 4.2.1 创建Java工程 4.2.2 读取数据 4.2.3 创建目录 4.2.4 创建文件 4.2.5 删除文件 4.2.6 遍历文件和目录 ...

  5. DNS无法区域传送(axfr,ixfr)

    这两天博主在学习dns服务器的配 首先简单介绍一下axfr,ixfr axfr:完全区域传送 ixfr :增量区域传送 主要是在dns主从服务器上面进行备份更新的. ----------------- ...

  6. 裸机——iNand

    1.先晓得iNand的基础知识 iNand是在SD卡基础上发展来的,而SD卡是在MMC的基础上发展来的,MMC是在Nand的基础上发展来的 我们晓得Nand的基础知识,而MMC对Nand大致做了两个改 ...

  7. Ball CodeForces - 12D

    传送门 N ladies attend the ball in the King's palace. Every lady can be described with three values: be ...

  8. linux-shell——04

    mv 移动文件或者目录 格式:mv [选项]      源文件/目录     目标文件/目录 注:若移动目标位置与源位置相同(当前下操作),则此操作相当于重命名(改名) ex: [root@local ...

  9. Balance POJ - 1837

    Description Gigel has a strange "balance" and he wants to poise it. Actually, the device i ...

  10. python基础之正则表达式和re模块

    正则表达式 就其本质而言,正则表达式(或 re)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 ...