题目描述

  历史学考后,$MYC$和$ztr$对答案,发现选择题他们没有一道选的是一样的。最后他们都考了个$C$。现在问题来了,假设他们五五开,分数恰好一样(问答题分数也恰好一样,只考虑选择题)。已知考题是$N$道选择题(第$i$题分数为$M(i)$)。问$ztr$和$MYC$做对的题的并有多少种可能?众所周知,历史学考选择题有$25$题,但是$MYC$为了给你降低难度,$n$不超过$20$。
  一句话题意:有多少个非空子集,能划分成和相等的两份。

原题见:$USACO\ 2012\ OPEN\ GOLD\ subsets$


输入格式

第一行:整数$N$
第$2..1+N$行:第$i+1$行是$M(i)$


输出格式

一个整数表示答案


样例

样例输入:

4
1
2
3
4

样例输出:

3


数据范围与提示

样例解释:

有三个合法的集合:$\{1,2,3\}$,它可以被分割成$\{1,2\}$和$\{3\}$,集合$\{1,3,4\}$,它可以被分割为$\{1,3\}$和$\{4\}$;集合$\{1,2,3,4\}$可以被分割成子集$\{1,4\}$和$\{2,3\}$。

数据范围:

不要问我为什么数据范围这么奇怪。。。因为要给大家送分。。。


题解

又被题意坑死……

先来解释一下题意,题目是要统计所有子集中可以被等分的集合(如果有多种方案,不能重复统计)。

$\Theta(n^3)$暴力应该都会打(分为不选,给一个人,给另一个人)。

但是这样显然过不去,考虑$meet\ in\ the\ middle$,先枚举左边$3^{\frac{N}{2}}$,再枚举右边$3^{\frac{N}{2}}$即可。

时间复杂度:$\Theta(6^{\frac{N}{2}})$。、

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
const int mod=30000019;
struct rec{int nxt,to,now,val;}e[59050];
int head[300000019],cnt;
int N;
int a[21];
bool vis[1100][1100],v[21];
int ans;
void insert(int now,int val)
{
int key=(val%mod+mod)%mod;
for(int i=head[key];i;i=e[i].nxt)
if(e[i].now==now&&e[i].val==val)return;
e[++cnt].nxt=head[key];
e[cnt].now=now;
e[cnt].val=val;
head[key]=cnt;
}
int ask(int now,int val)
{
int key=(val%mod+mod)%mod,res=0;
for(int i=head[key];i;i=e[i].nxt)
if(e[i].val==val&&!vis[e[i].now][now])
{
vis[e[i].now][now]=1;
res++;
}
return res;
}
void dfs1(int x,int w)
{
if(x>N/2)
{
int now=0;
for(int i=1;i<=N/2;i++)now=now<<1|v[i];
insert(now,w);
return;
}
v[x]=0;dfs1(x+1,w);
v[x]=1;dfs1(x+1,w+a[x]);
v[x]=1;dfs1(x+1,w-a[x]);
}
void dfs2(int x,int w)
{
if(x>N)
{
int now=0;
for(int i=N/2+1;i<=N;i++)now=now<<1|v[i];
ans+=ask(now,w);
return;
}
v[x]=0;dfs2(x+1,w);
v[x]=1;dfs2(x+1,w+a[x]);
v[x]=1;dfs2(x+1,w-a[x]);
}
int main()
{
scanf("%d",&N);
for(int i=1;i<=N;i++)scanf("%d",&a[i]);
dfs1(1,0);
dfs2(N/2+1,0);
printf("%d",ans-1);
return 0;
}

rp++

[CSP-S模拟测试]:毛一琛(meet in the middle)的更多相关文章

  1. 「10.13」毛一琛(meet in the middle)·毛二琛(DP)·毛三琛(二分+随机化???)

    A. 毛一琛 考虑到直接枚举的话时间复杂度很高,我们运用$meet\ in\ the\ middle$的思想 一般这种思想看似主要用在搜索这类算法中 发现直接枚举时间复杂度过高考虑枚举一半另一半通过其 ...

  2. [CSP-S模拟测试]:毛三琛(随机化+二分答案)

    题目传送门(内部题69) 输入格式 第一行正整数$n,P,k$.第二行$n$个自然数$a_i$.$(0\leqslant a_i<P)$. 输出格式 仅一个数表示最重的背包的质量. 样例 样例输 ...

  3. [CSP-S模拟测试]:毛二琛(DP)

    题目描述 $MYC$在$NOI2018$中,遇到了$day1T2$这样一个题,题目是让你求有多少“好”的排列.$MYC$此题没有获得高分,感到非常惭愧,于是回去专心研究排列了.如今数排列的题对$MYC ...

  4. [CSP-S模拟测试]:答题(meet in the middle)

    题目传送门(内部题142) 输入格式 输入文件的第一行为两个数$n,P$. 接下来一行$n$为个正整数,表示每道题的分数. 输出格式 输出一行一个正整数,为至少需要获得的分数. 样例 样例输入: 2 ...

  5. NOIP 模拟 $30\; \rm 毛一琛$

    题解 \(by\;zj\varphi\) 如何判断一个集合可以被拆成两个相等的部分? 枚举两个集合,如果它们的和相等,那么他们的并集就是合法的,复杂度 \(\mathcal O\rm(3^n)\) \ ...

  6. [考试反思]1013csp-s模拟测试71:徘徊

    分差好大...但是从排名上看也许还可以接受? 不算太炸 但是这个还是算了吧... 其实状态不是很好. T1不会,打的搜索,想到一个剪枝但是感觉没什么用,所以没打. 考后打上,85了...打上另一个就9 ...

  7. 「题解」:毛一琛/$cow$ $subsets$

    问题 A: 毛一琛/$cow$ $subsets$ 时间限制: 1 Sec  内存限制: 512 MB 题面 题面谢绝公开. 题解 题名貌似是个大神??看起来像是签到题然后就死了. 首先$O(3^n) ...

  8. noip模拟30[毛毛毛探探探]

    \(noip模拟30\;solutions\) 所以说,这次被初中的大神给爆了????? 其实真的不甘心,这次考场上的遗憾太多,浪费的时间过多,心情非常不好 用这篇题解来结束这场让人伤心的考试吧 \( ...

  9. noip模拟测试30

    考试总结:这次考试,不是很顺利,首先看了一眼题目,觉得先做T1,想了一会觉得没什么好思路,就去打暴力,结果我不会枚举子集,码了半天发现不对,就随便交了一份代码上去,结果CE了,然后去打T3,20min ...

随机推荐

  1. 2019CSP-S游记(?)

    认识我的人都知道,我懒得写算法和模拟赛的博客,但是游记就不一样了,它比较好玩. Day0 中午随便收拾了下就坐高铁出发了,一个小时左右就到南昌了,随后坐公交,再步行到宾馆安置(也没多远). 宾馆离学校 ...

  2. 修改SpringBoot启动时的默认Banner图案

    1.在src/main/resources下新建banner.txt,在文件中加入要显示的图案即可: 2.生成图案的网站: http://patorjk.com/software/taag/ http ...

  3. 学习C++的意义

    1,常见的观点: 1,并不是每个应届生都有机会写操作系统和驱动程序: 2,嵌入式系统也是软家系统,只不过是软件在出厂的时候已经被烧写到硬件中了,用户没有办法修改软件而已,因此嵌入式系统也是软件系统,C ...

  4. 洛谷 P1541 乌龟棋 & [NOIP2010提高组](dp)

    传送门 解题思路 一道裸的dp. 用dp[i][j][k][kk]表示用i个1步,j个2步,k个3步,kk个4步所获得的最大价值,然后状态转移方程就要分情况讨论了(详见代码) 然后就是一开始统计一下几 ...

  5. 最长公共子序列(LCS) Medium2

    The company "21st Century Fruits" has specialized in creating new sorts of fruits by trans ...

  6. 4-2如何判断字符串a是否以字符串b开头或结尾

    1.相关介绍 1.1修改文件权限和查看文件权限 在windows平台实验时 os.chmod()无法将文件权限修改为可执行,暂不深究如何实现.在linux平台进行测试. (1)创建三个文件 pytho ...

  7. HDU1688-POJ3463-Sightseeing(求次短路的条数)

    题意 求出最短路和次短路的条数,当次短路比最短路长度小1时,输出条数之和,反之输出最短路条数. 题解  dis1[],cnt1[],dis2[],cnt2[] 分别表示最短路的长度和条数,次短路的长度 ...

  8. letsencrypt 免费SSL证书申请, 自动更新

    Let's Encrypt 泛域名 证书申请 及自动更新 关键字:SSL证书.HTTPS 初次申请 1. 下载certbot wget https://dl.eff.org/certbot-auto ...

  9. 源码编译Redis Desktop Manager | 懒人屋

    原文:源码编译Redis Desktop Manager | 懒人屋 源码编译Redis Desktop Manager  2.3k  字    10  分钟    2019-10-10 文章背景 本 ...

  10. C#导出大量数据到excel,怎么提升性能

    一,要提升性能,我们先要知道耗时的地方在哪里 1,数据库查询,2,把数据组合成新集合循环嵌套太多 二,那我们怎么优化呢? 一,数据库查询,1>,数据库查询:如果数据量小,我们可以用临时datat ...