JZOJ 平衡的子集
Description
夏令营有N个人,每个人的力气为M(i)。请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法?
Input
第一行一个整数N,表示人数。
接下来N行,每行一个整数M(i)
Output
输出一行一个整数,表示一共多少种选法。
Sample Input
4
1
2
3
4
Sample Output
3
样例解释:
第一种选出{1,2,3},分成{1,2}和{3}两组;
第二种选出{1,3,4},分成{1,3}和{4}两组;
第三种选出{1,2,3,4},分成{1,4}和{2,3}两组。
Data Constraint
40%的数据满足:1<=M(i)<=1000;
对于100%的数据满足:2<=N<=20,1<=M(i)<=100000000
解题思路
折半搜索,先从1搜到n/2,每个有选到A组,选到B组,不选三种选择,最后将总和与状态记下来,n/2+1 ~ n搜一遍同样操作,最后排个序统计答案。
代码
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int MAXN = 25;
typedef long long LL;
struct Data{
LL sum;
LL S;
}data1[1<<20],data2[1<<20];
int a[MAXN],n,k,cnt1,cnt2,ans;
bool vis[(1<<20)+2000];
inline void dfs1(int x,int Sum,int s){
if(x==k+1) {
data1[++cnt1].S=s;
data1[cnt1].sum=Sum;
return ;
}
dfs1(x+1,Sum+a[x],s+(1<<(n-x)));
dfs1(x+1,Sum-a[x],s+(1<<(n-x)));
dfs1(x+1,Sum,s);
}
inline void dfs2(int x,int Sum,int s){
if(x==n+1){
data2[++cnt2].S=s;
data2[cnt2].sum=Sum;
return ;
}
dfs2(x+1,Sum+a[x],s+(1<<(n-x)));
dfs2(x+1,Sum-a[x],s+(1<<(n-x)));
dfs2(x+1,Sum,s);
}
inline bool cmp(Data A,Data B){
return A.sum<B.sum;
}
int main(){
freopen("subset.in","r",stdin);
freopen("subset.out","w",stdout);
scanf("%d",&n);
for(register int i=1;i<=n;i++) scanf("%d",&a[i]);
k=n/2;dfs1(1,0,0);dfs2(k+1,0,0);
sort(data1+1,data1+1+cnt1,cmp);
sort(data2+1,data2+1+cnt2,cmp);
int i=1,j=1;data1[++cnt1].sum=data2[++cnt2].sum=1e9;
while(i<cnt1 && j<cnt2){
if(data1[i].sum<data2[j].sum) i++;
else if(data1[i].sum>data2[j].sum) j++;
else {
int l1=i,r1=i,l2=j,r2=j;
while(data1[r1].sum==data1[l1].sum) r1++;
while(data2[r2].sum==data2[l2].sum) r2++;
for(register int p=l1;p<r1;p++)
for(register int q=l2;q<r2;q++){
if(vis[data1[p].S+data2[q].S]) continue;
ans++;vis[data1[p].S+data2[q].S]=1;
}
i=r1,j=r2;
}
}cout<<ans-1<<endl;
return 0;
}
JZOJ 平衡的子集的更多相关文章
- 【NOIP2016提高A组集训第4场11.1】平衡的子集
题目 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 分析 如果暴力枚举每个人被分到哪 ...
- 【JZOJ4841】【NOIP2016提高A组集训第4场11.1】平衡的子集
题目描述 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 数据范围 40%的数据满足: ...
- 数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL
树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构. a.树是n ...
- BST性能分析&改进思路——平衡与等价
极端退化 前面所提到的二叉搜索树,已经为我们对数据集进行高效的静态和动态操作打开了一扇新的大门.正如我们所看到的,BST从策略上可以看作是将之前的向量(动态数组)和链表结构的优势结合起来,不过多少令我 ...
- uva1354 天平难题 【位枚举子集】||【huffman树】
题目链接:https://vjudge.net/contest/210334#problem/G 转载于:https://blog.csdn.net/todobe/article/details/54 ...
- [jzoj NOIP2018模拟11.02]
嗯T1忘记取模了,100到20 嗯T2忘记了那啥定理,暴力也写炸了,这题我认 嗯T3线段树合并分裂没有写炸,考场上就知道妥妥的70分.但是,分数出的时候听到有人说暴力也是70分,我???脸黑,枉我敲了 ...
- R语言中样本平衡的几种方法
R语言中样本平衡的几种方法 在对不平衡的分类数据集进行建模时,机器学习算法可能并不稳定,其预测结果甚至可能是有偏的,而预测精度此时也变得带有误导性.在不平衡的数据中,任一算法都没法从样本量少的类中获取 ...
- YOLOv4: Darknet 如何于 Docker 编译,及训练 COCO 子集
YOLO 算法是非常著名的目标检测算法.从其全称 You Only Look Once: Unified, Real-Time Object Detection ,可以看出它的特性: Look Onc ...
- 成吨提高开发效率:Intellij Shortcuts精简子集与思维模式
在线精简cheatsheet备查表:intellij.linesh.twGithub项目:intellij-mac-frequent-keymap Intellij的快捷键多而繁杂,从官方推荐的key ...
随机推荐
- Glassfish安装、基本使用、在idea中配置Glassfish
Glassfish安装.基本使用. 一.glassfish简介 glassfish是一款web应用服务器,和tomcat一样,也是一款优秀的Servlet容器. 二.glassfish知识点 1.do ...
- re 模块 (正则的使用)
一.正则表达式 英文全称: Regular Expression. 简称 regex或者re.正则表达式是对字符串操作的一种逻辑公式. 我们一般使用正则表达式对字符串进行匹配和过滤. 使用正则的优缺点 ...
- Linux 启动、关闭、重启服务的两种方式
1.一种是可以使用service脚本来调度,如: service 服务名 startservice 服务名 stopservice 服务名 restart 2.第二种可以直接进入/etc/init.d ...
- Redis —yum安装全过程
访问 https://redis.io/download 官网,只看这一张图 一路执行完毕即安装成功,下面是执行过程图 看到显示redis的安装路径 接下来要配置下一些参数设置 https://www ...
- 安装office2019
win10系统安装office2019 安装文件下载 https://pan.baidu.com/s/1VnqJ-hNwysPKBhdzE3FSww#list/path=%2F&parentP ...
- c#设置文件及文件夹的属性
c#中通过FileAttributes枚举来设置文件或文件夹的属性. FileAttributes 枚举 成员名称 说明 Archive 文件的存档状态.应用程序使用此属性为文件加上备份或移除标记. ...
- 电脑缺失ACPI.sys
解决方法:注:U盘内需要有PE系统 拷贝一份正常的acpi.sys文件到u盘,插入电脑 > 开机时按F9 > 选中第三个USB *** > 回车进入PE系统,将acpi.sys放入图 ...
- P1249 最大乘积
打暴力找规律,都是连续自然数去掉一个 n=int(input()) a=[] cnt=0 i=2 tot=0 ans=1 while tot<=n: tot+=i cnt+=1 a.append ...
- Quick BI 的模型设计与生成SQL原理剖析
一.摘要 随着物联网的告诉发展,数据量呈现井喷式的增长,如何来分析和使用这些数据,使数据产生商业价值,已经变得越来越重要.值得高兴的是,当前越来越多的人已经意识到了用数据分析决定商业策略的重要性,也都 ...
- 模板:数位DP
第一次听说dp还有模板的... 当然你要是记忆化搜索的话,就可以有一些套路 这是一个伪代码: LL Dfs(LL now,限制,LL top){ if(!now) return 判断条件; if(!t ...