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 ...
随机推荐
- Tree and Permutation (HDU 6446) 题解
// 昨天打了一场网络赛,表现特别不好,当然题目难度确实影响了发挥,但还是说明自己太菜了,以后还要多多刷题. 2018 CCPC 网络赛 I - Tree and Permutation 简单说明一下 ...
- RESTful API -- rules
RESTful介绍 REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”或“表现层状态转化”. 推荐 ...
- c# 删除空文件夹
https://www.cnblogs.com/vikimono/p/11066778.html
- 一个四五年的Java开发程序员,该准备哪些去面试?
上周面试了一周,感触颇深,总结一下. 面试了公司大概有阿里,携程,爱奇艺,唯品会,途牛,bilibili,大众点评,阿里和爱奇艺是电话面试,其他现场面试. 首先,五年左右,应该算高级开发工程师,大部分 ...
- jQuery5事件相关
一.注册事件的方式 1.直接注册事件 $(this).事件名(动作函数)://$(this).click(fucntion(){//动作代码}); 2.bind同时给一个对象注册多个事件 $(this ...
- c++ stream操作杂记
包含简单的读写文件,供初学者入门,stream目前包含三种,终端,文件,内存,注意宽字节. ) ; ) ; ] ; } pasting
- Spring AOP(三)--XML方式实现
本文介绍通过XML方式实现Spring AOP,在上一篇中已经介绍了通过注解+java配置的方式,这篇文章主要是看XML中怎么配置,直接上代码了: 一.创建一个连接点 1⃣️定义接口 注意⚠️:可以定 ...
- <form>(表单)标签和常用的类型
1.定义和用法 <form> 标签用于为用户输入创建 HTML 表单. 表单能够包含 input 元素,比如文本字段.复选框.单选框.提交按钮等等. 表单还可以包含 menus.texta ...
- [code]彩色图像直方图均衡化 histogram_rgb
//2013.9 eageldiao #ifdef HISTOGRAM_RGB unsigned ]; unsigned intncount[]={},ncount1[]={},ncount2[]={ ...
- js 之 call 、 apply
在学习js过程中怎么也绕不过用到call.apply方法,感觉都差不多,现在看看他们的用法,区别 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(conte ...