CF888E Maximum Subsequence (Meet in the middle,贪心)
题目链接
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,贪心)的更多相关文章
- $CF888E\ Maximum\ Subsequence$ 搜索
正解:$meet\ in\ the\ middle$ 解题报告: 传送门$QwQ$. 发现数据范围为$n\leq 35$,所以$2^{\frac{n}{2}}$是可做的. 所以先拆成$A,B$两个集合 ...
- CF888E Maximum Subsequence(meet in the middle)
给一个数列和m,在数列任选若干个数,使得他们的和对m取模后最大( \(1<=n<=35\) , \(1<=m<=10^{9}\)) 考虑把数列分成两份,两边分别暴力求出所有的可 ...
- [CF888E] Maximum Subsequence 序列分治
早期作品,不喜轻喷. LG传送门 序列分治板子题. 切这道题用了好长时间,所以想发篇题解作为纪念 . 首先,我们认真观察题目数据(面向数据做题是个好习惯),发现题目的\(n\)竟然只有\(35\),我 ...
- 【CF888E】Maximum Subsequence(meet in the middle)
[CF888E]Maximum Subsequence(meet in the middle) 题面 CF 洛谷 题解 把所有数分一下,然后\(meet\ in\ the\ middle\)做就好了. ...
- 【CF888E】Maximum Subsequence 折半搜索
[CF888E]Maximum Subsequence 题意:给你一个序列{ai},让你从中选出一个子序列,使得序列和%m最大. n<=35,m<=10^9 题解:不小心瞟了一眼tag就一 ...
- Codeforces Round #648 (Div. 2) E. Maximum Subsequence Value 贪心
题意:E.Maximum Subsequence Value 题意: 给你n 个元素,你挑选k个元素,那么这个 k 集合的值为 ∑2i,其中,若集合内至少有 max(1,k−2)个数二进制下第 i 位 ...
- Meet in the middle学习笔记
Meet in the middle(MITM) Tags:搜索 作业部落 评论地址 PPT中会讲的很详细 当搜索的各项互不影响(如共\(n\)个物品前\(n/2\)个物品选不选和后\(n/2\)个物 ...
- Educational Codeforces Round 32:E. Maximum Subsequence(Meet-in-the-middle)
题目链接:E. Maximum Subsequence 用了一个Meet-in-the-middle的技巧,还是第一次用到这个技巧,其实这个技巧和二分很像,主要是在dfs中,如果数量减小一半可以节约很 ...
- 1007 Maximum Subsequence Sum
Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to ...
随机推荐
- Java - 基础数据类型的极值
- Linux实战教学笔记15:用户管理初级(下)
第十四节 用户管理初级(下) 标签(空格分隔): Linux实战教学笔记-陈思齐 ---更多资料点我查看 1,用户查询相关命令id,finger,users,w,who,last,lastlog,gr ...
- 汇编:输出寄存器AX中的内容
DATAS segment Temp db '0000H','$' DATAS ends CODES segment START: mov AX,DATAS mov DS,AX ;正式代码开始 mov ...
- POJ 2676 数独(DFS)
Sudoku Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21612 Accepted: 10274 Specia ...
- 机器学习实战 -- 决策树(ID3)
机器学习实战 -- 决策树(ID3) ID3是什么我也不知道,不急,知道他是干什么的就行 ID3是最经典最基础的一种决策树算法,他会将每一个特征都设为决策节点,有时候,一个数据集中,某些特征属 ...
- B-树 分合之道
P.s:在代码里会同时用到向量和B-树的search,insert, remove,具体调用的是哪个结构的函数结合上下文就能看懂. 根据上一篇文章,我们对于这棵树的大致结构已经明了,那该如何有效利用并 ...
- WPF系列教程——(一)仿TIM QQ界面 - 简书
原文:WPF系列教程--(一)仿TIM QQ界面 - 简书 TIM QQ 我们先来看一下TIM QQ长什么样,整体可以将界面分为三个部分 TIM QQ 1. 准备 阅读本文假设你已经有XAML布局的基 ...
- JSONP解决跨域完整例子
1.这个案例是仿照百度搜索,输入关键词,会出现下拉菜单的过程. 效果: 2.具体做法: (1)利用百度的数据库做script标签的src. 复制之后的地址是这样的 https://sp0.baidu. ...
- Jsoncpp 编译
1. linux下编译jsoncpp 从(http://jsoncpp.sourceforge.net/)下载源码包“jsoncpp-src-0.5.0.tar.gz”,解压后在其解压后目录中运行 $ ...
- ceph 存储系统
http://w w w.c s d n 123.com/html/topnews201408/2/4702.htm