折半搜索+状态压缩【P3067】 [USACO12OPEN]平衡的奶牛群Balanced Cow S…
Description
给n个数,从中任意选出一些数,使这些数能分成和相等的两组。
求有多少种选数的方案。
Input
第\(1\)行:一个整数\(N\)
第\(2\)到\(N+1\)行,包含一个整数\(m_i\)
Output
一行:平衡的集合的个数.
看到题的一瞬间数据范围?
\(N \leq 20?\)状压!
明显直接做过不去,选择折半搜索.
折半搜索的话会有三种情况
- 一.选择当前位置
- 二.选择当前位置,给第一组.
- 三.选择当前位置,给第二组.
然后直接跑折半搜索+状压即可.
存储类似链式前向星,应该不是很难理解,就不过多解释了.
然后就枚举状态即可,可是直接枚举到\(2^n-1\)显然会\(T\)掉.
由于我们后半截的状态已知,所以说,我们只需要枚举前一半的状态即可.
注意要\(sort\)找到两边力气值相等的.
其他的就不太难理解了,如果不能理解的话可以私信我 qwq.
代码
#include<cstdio>
#include<cctype>
#include<algorithm>
#define N 10000008
#define R register
using namespace std;
inline void in(int &x)
{
int f=1;x=0;char s=getchar();
while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
while(isdigit(s)){x=x*10+s-'0';s=getchar();}
x*=f;
}
int n,w[28],mid,head[N];
struct cod{int u,val;}e[200008],edge[N];
int v[N],ans,tot,ttt,sta,cnt;
bool vis[2500000];
void dfs1(int dep,int sum,int state)
{
if(dep>mid)
{
edge[++tot].u=head[state];
edge[tot].val=sum;
head[state]=tot;
return;
}
dfs1(dep+1,sum,state);
dfs1(dep+1,sum+w[dep],state|(1<<(dep-1)));
dfs1(dep+1,sum-w[dep],state|(1<<(dep-1)));
}
void dfs2(int dep,int sum,int state)
{
if(dep>n)
{
e[++ttt].u=state;
e[ttt].val=sum;
return;
}
dfs2(dep+1,sum,state);
dfs2(dep+1,sum+w[dep],state | (1<<(dep-1)));
dfs2(dep+1,sum-w[dep],state | (1<<(dep-1)));
}
inline bool ccp(const cod&a,const cod&b)
{
return a.val<b.val;
}
int main()
{
in(n);mid=(n+1)>>1;sta=(1<<n)-1;
for(R int i=1;i<=n;i++)in(w[i]);
dfs1(1,0,0);dfs2(mid+1,0,0);
sort(e+1,e+ttt+1,ccp);
for(R int i=0;i<=(1<<mid);i++)
{
R int cnt=0;
for(R int j=head[i];j;j=edge[j].u)
v[++cnt]=edge[j].val;
sort(v+1,v+cnt+1);
R int pos=1;
if(v[1]>e[ttt].val)break;
for(R int j=1;j<=ttt;j++)
{
while(pos<=cnt and v[pos]<e[j].val)pos++;
if(pos>cnt)break;
if(v[pos]==e[j].val)
vis[i|e[j].u]=true;
}
}
for(R int i=1;i<=sta;i++)
if(vis[i])ans++;
printf("%d",ans);
}
/*
10
5 8 16 17 25 83 24 7 8 20
89
*/
折半搜索+状态压缩【P3067】 [USACO12OPEN]平衡的奶牛群Balanced Cow S…的更多相关文章
- 洛谷 P3067 [USACO12OPEN]平衡的奶牛群Balanced Cow S…
P3067 [USACO12OPEN]平衡的奶牛群Balanced Cow S… 题目描述 Farmer John's owns N cows (2 <= N <= 20), where ...
- [luogu3067 USACO12OPEN] 平衡的奶牛群
传送门 Solution 折半搜索模板题 考虑枚举每个点在左集合和右集合或者不在集合中,然后排序合并即可 Code //By Menteur_Hxy #include <cmath> #i ...
- POJ 2046 Gap 搜索- 状态压缩
题目地址: http://poj.org/problem?id=2046 一道搜索状态压缩的题目,关键是怎样hash. AC代码: #include <iostream> #include ...
- P3067 [USACO12OPEN]平衡的奶牛群(折半暴搜)
暴搜无疑.... 首先考虑纯暴搜...... 考虑每一个数: 选在左边集合 选在右边集合 不选 一共三种情况,用一个数组记录搜到的答案,所以暴搜是3^N的复杂度...直接死亡 于是讲折半暴搜.... ...
- HDU-5025 Saving Tang Monk 广度搜索 状态压缩
题目链接:https://cn.vjudge.net/problem/HDU-5025 题意 救唐僧,路上有m(<=9)把钥匙,最多5条蛇和一个唐僧. 目标是前往唐僧的地方,用全部钥匙打开全部的 ...
- Luogu3067 平衡的奶牛群 Meet in the middle
题意:给出$N$个范围在$[1,10^8]$内的整数,问有多少种取数方案使得取出来的数能够分成两个和相等的集合.$N \leq 20$ 发现爆搜是$O(3^N)$的,所以考虑双向搜索. 先把前$3^\ ...
- Doing Homework---hdu1074(状态压缩&&记忆化搜索)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 有n(n<=15)门课需要做作业,每门课所需时间是used_time以及每门课作业上交的最 ...
- 折半搜索+Hash表+状态压缩 | [Usaco2012 Open]Balanced Cow Subsets | BZOJ 2679 | Luogu SP11469
题面:SP11469 SUBSET - Balanced Cow Subsets 题解: 对于任意一个数,它要么属于集合A,要么属于集合B,要么不选它.对应以上三种情况设置三个系数1.-1.0,于是将 ...
- loj 1011(状态压缩+记忆化搜索)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25837 思路:状态压缩+记忆化搜索. #include<io ...
随机推荐
- linux kernel 关于RSS/RPS/RFS/XPS的介绍
Introduction============ This document describes a set of complementary techniques in the Linuxnetwo ...
- [Leetcode] Linked list cycle ii 判断链表是否有环
Given a linked list, return the node where the cycle begins. If there is no cycle, returnnull. Follo ...
- MySQL 创建一个简单的成绩管理系统
操作过程使用实验楼. 首先是创建一个数据库studentsystem,使用语句是: CREATE DATABASE studentsystem; 查看创建好的数据库的命令还是SHOW DATABAS ...
- NOIP2017宝藏 [搜索/状压dp]
NOIP2017 宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖掘 ...
- POJ3159:Candies(差分约束)
Candies Time Limit: 1500MS Memory Limit: 131072K Total Submissions: 39666 Accepted: 11168 题目链接:h ...
- AnnotationConfigApplicationContext.的用法的核心代码
public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationCont ...
- IDEA 用maven创建web项目编译时不能发布resources中的文件
1.在pom.xml加入 <build> <resources> <resource> <directory>${basedir}/src/main/j ...
- ntpq –p命令
ntpq用来监视ntpd操作,ntpq -p查询网络中的NTP服务器,同时显示客户端和每个服务器的关系 [root@ ~]# ntpq -p remote refid st t when poll r ...
- python读写Excel文件_xlrd模块读取,xlwt模块写入
一.安装xlrd模块和xlwt模块(服务器) 1. 下载xlrd模块和xlwt模块 到python官网http://pypi.python.org/pypi/xlrd下载模块.下载的文件例如:xlrd ...
- saltstack入门至放弃之salt安装部署
学习了一段时间的saltstack,是时候记录下了.友提:学习环境是两台centos_7.2_x64机器 系统初始化: 两台机器执行以下脚本即可(友提:两台服务器的主机名配置在/etc/hosts中, ...