【算法】折半搜索+数学计数

【题意】给定n个数(n<=20),定义一种方案为选择若干个数,这些数可以分成两个和相等的集合(不同划分方式算一种),求方案数(数字不同即方案不同)。

【题解】

考虑直接枚举集合的子集,再枚举子集的子集(划分方式),相当于将子集看成天平,枚举子集一些数置左,剩余数置右,则每个数有三种可能:不选,置左,置右。

由此可知,直接枚举集合子集的子集复杂度是O(3^n)。

考虑将总集划分成两半,则枚举一半的复杂度为O(3^(n/2))。

得到两半都如何合并?

如果相同集合不同划分方式算多种的话,可以将两半都unique,然后枚举一半的所有天平,在另一半二分找到相等天平,统计方案,复杂度O(3^(n/2)*log(3^(n/2))。

但是题目要求相同集合只算一次,如果仍然用上述方法则不能unique,因为相同集合只算一次,可以将方案标记到vis[],最后一次统计。但是没有unique的话二分就没有意义(如果全部数字相同仍需要全部扫描),复杂度O(3^n),显然超时。

考虑另一种方法,将一组数拿过去比较,两边两指针扫描,相等的标记到vis[]。这样有一个问题,就是左边拿来比较的数字不能有相同的数字,否则复杂度又不对了。

我们将左边的天平按选择的方案划分,即相同方案的一起处理,相同方案内相同的数字就可以舍去,不同的数字就两指针扫一遍,这样保证复杂度O(6^(n/2))。

总复杂度O(6^(n/2))。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct left{int v,from;}l[];
struct right{int v,s;}r[];
int n,first[],n0,ltot=,rtot=,a[],m,q[];
bool vis[];
void dfsl(int dep,int v,int s){
if(dep==n0){ltot++;l[ltot].v=v;l[ltot].from=first[s];first[s]=ltot;}
else{
dfsl(dep+,v,s);
dfsl(dep+,v+a[dep],s|(<<dep));
dfsl(dep+,v-a[dep],s|(<<dep));
}
}
void dfsr(int dep,int v,int s){
if(dep==n){rtot++;r[rtot].v=v;r[rtot].s=s;}
else{
dfsr(dep+,v,s);
dfsr(dep+,v+a[dep],s|(<<dep));
dfsr(dep+,v-a[dep],s|(<<dep));
}
}
bool cmp(right a,right b){return a.v<b.v;} int main()
{
scanf("%d",&n);
for(int i=;i<n;i++)scanf("%d",&a[i]);
n0=(n+)/;
dfsl(,,);//0~n0-1
dfsr(n0,,);//n0~n-1
sort(r+,r+rtot+,cmp);
for(int i=;i<(<<n0);i++){
m=;
for(int j=first[i];j;j=l[j].from)q[++m]=l[j].v;
sort(q+,q+m+);
int k=;
for(int j=;j<=rtot;j++){
while(k<=m&&q[k]<r[j].v)k++;
if(k>m)break;
if(q[k]==r[j].v)vis[r[j].s|i]=;
}
}
int ans=;
for(int i=;i<(<<n);i++){if(vis[i])ans++;}//细节:必须选数
printf("%d",ans);
return ;
}

【BZOJ】2679: [Usaco2012 Open]Balanced Cow Subsets的更多相关文章

  1. bzoj2679: [Usaco2012 Open]Balanced Cow Subsets(折半搜索)

    2679: [Usaco2012 Open]Balanced Cow Subsets Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 462  Solv ...

  2. 【BZOJ 2679】[Usaco2012 Open]Balanced Cow Subsets(折半搜索+双指针)

    [Usaco2012 Open]Balanced Cow Subsets 题目描述 给出\(N(1≤N≤20)\)个数\(M(i) (1 <= M(i) <= 100,000,000)\) ...

  3. BZOJ_2679_[Usaco2012 Open]Balanced Cow Subsets _meet in middle+双指针

    BZOJ_2679_[Usaco2012 Open]Balanced Cow Subsets _meet in middle+双指针 Description Farmer John's owns N ...

  4. 折半搜索+Hash表+状态压缩 | [Usaco2012 Open]Balanced Cow Subsets | BZOJ 2679 | Luogu SP11469

    题面:SP11469 SUBSET - Balanced Cow Subsets 题解: 对于任意一个数,它要么属于集合A,要么属于集合B,要么不选它.对应以上三种情况设置三个系数1.-1.0,于是将 ...

  5. 【BZOJ】1635: [Usaco2007 Jan]Tallest Cow 最高的牛

    [题意]n头牛,其中最高h.给定r组关系a和b,要求满足h[b]>=h[a]且a.b之间都小于min(h[a],h[b]),求第i头牛可能的最高高度. [算法]差分 [题解]容易发现r组关系只能 ...

  6. 【BZOJ】1666 [Usaco2006 Oct]Another Cow Number Game 奶牛的数字游戏

    [算法]贪心&&堆 [题解]反过来看就是合并任意两块木板,花费为木板长度之和. 显然从最小的两块开始合并即可,用堆(优先队列)维护. 经典DP问题石子归并是只能合并相邻两堆石子,所以不 ...

  7. 【BZOJ】1699 [Usaco2007 Jan]Balanced Lineup排队

    [算法]线段树 #include<cstdio> #include<cctype> #include<algorithm> using namespace std; ...

  8. 【BZOJ】3016: [Usaco2012 Nov]Clumsy Cows(贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3016 之前yy了一个贪心,,,但是错了,,就是枚举前后对应的字符(前面第i个和后面第i个)然后相同答 ...

  9. 【BZOJ】1636: [Usaco2007 Jan]Balanced Lineup(rmq+树状数组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1636 (我是不会说我看不懂题的) 裸的rmq.. #include <cstdio> # ...

随机推荐

  1. OSG学习:位置变换节点示例

    osg::PositionAttitudeTransform节点. #include <osgViewer\Viewer> #include <osg\Node> #inclu ...

  2. PokeCats开发者日志(十三)

      现在是PokeCats游戏开发的第六十二天的晚上,把软著权登记证书的截图加上,又重新提交审核了一遍,但愿能过吧...

  3. Jenkins系列-Jenkins用户权限和角色配置

    由于jenkins默认的权限管理体系不支持用户组或角色的配置,因此需要安装第三发插件来支持角色的配置,这边将使用Role Strategy Plugin,介绍页面:https://wiki.jenki ...

  4. phpcms免登录cookies设置方案

    PHPCMS的SESSION时间长一些的解决办法修改两个文件: phpsso_server/caches/configs/system.php里的 'session_ttl' => 999999 ...

  5. dev_queue_xmit 发生了什么?skb还会在哪里缓存

    见 codebox/net/qdisk/xmit.log中保存了一份记录 调用关系 sch_direct_xmit --> dev_hard_start_xmit --> xmit_one ...

  6. Android------BottonTabBar

    前言:一款简单好用封装好的AndroidUI控件,底部导航栏. 1.使用 1.1添加  compile 'com.hjm:BottomTabBar:1.1.1' 1.2  activity_main. ...

  7. AngularJS 中特性(attr)和属性(prop)的区别

    attr() 和 removeAttr() 方法是对特性进行处理的, 而 prop() 是对属性进行操作的 , 但是很多时候操作的东西是同一个 , 但是也是有区别的, 区别在于prop方法处理的是被 ...

  8. Foundation框架—时间输出格式NSDateFormatter

    在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理.下面来介绍NSDateFormatter的常用属性和API:  1.常用属性 @ ...

  9. BZOJ4710 JSOI2011分特产(容斥原理+组合数学)

    显然可以容斥去掉每人都不为空的限制.每种物品分配方式独立,各自算一个可重组合乘起来即可. #include<iostream> #include<cstdio> #includ ...

  10. Python使用requests模块下载图片

    MySQL中事先保存好爬取到的图片链接地址. 然后使用多线程把图片下载到本地. # coding: utf-8 import MySQLdb import requests import os imp ...