Luogu3067 平衡的奶牛群 Meet in the middle
题意:给出$N$个范围在$[1,10^8]$内的整数,问有多少种取数方案使得取出来的数能够分成两个和相等的集合。$N \leq 20$
发现爆搜是$O(3^N)$的,所以考虑双向搜索。
先把前$3^\frac{N}{2}$搜完,然后每一次搜出后$3^\frac{N}{2}$的时候,枚举前面的$2^\frac{N}{2}$,每一个对应一下看有没有和为$0$的方案即可。复杂度为$O(6^\frac{N}{2})$,虽然不开O2过不去qwq
#include<bits/stdc++.h>
using namespace std;
inline int read(){
;
char c = getchar();
while(!isdigit(c))
c = getchar();
while(isdigit(c)){
a = (a << ) + (a << ) + (c ^ ');
c = getchar();
}
return a;
}
struct HashTable{
#define MOD 103
struct node{
int num;
node* nxt;
}*begin[MOD] , *last[MOD];
void insert(int num){
int t = num % MOD;
)
t += MOD;
if(last[t] == NULL){
begin[t] = new node;
begin[t]->num = num;
begin[t]->nxt = NULL;
last[t] = begin[t];
}
else{
node* now = new node;
now->num = num;
now->nxt = NULL;
last[t]->nxt = now;
last[t] = now;
}
}
bool count(int num){
int t = num % MOD;
)
t += MOD;
for(node* i = begin[t] ; i != NULL ; i = i->nxt)
if(i->num == num)
;
;
}
}zt[ << ];
] , N , ans;
<< ][ << ];
void init(int now , int end , int cnt , int sum){
if(now > end){
zt[cnt].insert(sum);
return;
}
init(now + , end , cnt , sum);
init(now + , end , cnt | ( << now) , sum + M[now]);
init(now + , end , cnt | ( << now) , sum - M[now]);
}
void getAns(int now , int end , int cnt , int sum){
if(now > end){
; i < << (N >> ) ; i++)
if(!is[cnt][i] && (zt[i].count(sum) || zt[i].count(-sum))){
;
ans++;
}
return;
}
getAns(now + , end , cnt , sum);
getAns(now + , end , cnt | ( << now - (N >> )) , sum + M[now]);
getAns(now + , end , cnt | ( << now - (N >> )) , sum - M[now]);
}
int main(){
N = read();
; i < N ; i++)
M[i] = read();
init( , (N >> ) - , , );
getAns(N >> , N - , , );
cout << ans - ;
;
}
再放一个复杂度似乎不对但是很快的方法
#include<bits/stdc++.h>
using namespace std;
struct node{
int zt , sum;
}num1[] , num2[];
];
];
void dfs(node* num , int& cnt , int now , int end , int sum , int zt){
if(now > end){
num[++cnt].sum = sum;
num[cnt].zt = zt;
return;
}
dfs(num , cnt , now + , end , sum , zt);
dfs(num , cnt , now + , end , sum + M[now] , zt | ( << now));
dfs(num , cnt , now + , end , sum - M[now] , zt | ( << now));
}
bool cmp(node a , node b){
return a.sum < b.sum;
}
bool operator == (node a , node b){
return a.zt == b.zt && a.sum == b.sum;
}
int main(){
cin >> N;
; i < N ; i++)
cin >> M[i];
dfs(num1 , cnt1 , , (N - ) >> , , );
dfs(num2 , cnt2 , N >> , N - , , );
sort(num1 + , num1 + cnt1 + , cmp);
sort(num2 + , num2 + cnt2 + , cmp);
cnt1 = unique(num1 + , num1 + cnt1 + ) - num1 - ;
cnt2 = unique(num2 + , num2 + cnt2 + ) - num2 - ;
int p1 = cnt2 , p2 = cnt2;
; i <= cnt1 ; i++){
)
p1--;
p2 = p1;
)
p2--;
while(++p2 <= p1)
vis[num1[i].zt | num2[p2].zt] = ;
}
;
; i < << N ; i++)
ans += vis[i];
cout << ans;
;
}
Luogu3067 平衡的奶牛群 Meet in the middle的更多相关文章
- 洛谷 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 ...
- 折半搜索+状态压缩【P3067】 [USACO12OPEN]平衡的奶牛群Balanced Cow S…
Description 给n个数,从中任意选出一些数,使这些数能分成和相等的两组. 求有多少种选数的方案. Input 第\(1\)行:一个整数\(N\) 第\(2\)到\(N+1\)行,包含一个整数 ...
- Meet in the middle
搜索是\(OI\)中一个十分基础也十分重要的部分,近年来搜索题目越来越少,逐渐淡出人们的视野.但一些对搜索的优化,例如\(A\)*,迭代加深依旧会不时出现.本文讨论另一种搜索--折半搜索\((meet ...
- Meet in the middle学习笔记
Meet in the middle(MITM) Tags:搜索 作业部落 评论地址 PPT中会讲的很详细 当搜索的各项互不影响(如共\(n\)个物品前\(n/2\)个物品选不选和后\(n/2\)个物 ...
- SPOJ4580 ABCDEF(meet in the middle)
题意 题目链接 Sol 发现abcdef是互不相关的 那么meet in the middle一下.先算出abc的,再算def的 注意d = 0的时候不合法(害我wa了两发..) #include&l ...
- codevs1735 方程的解数(meet in the middle)
题意 题目链接 Sol 把前一半放在左边,后一半放在右边 meet in the middle一波 统计答案的时候开始想的是hash,然而MLE了两个点 实际上只要排序之后双指针扫一遍就行了 #inc ...
- 【BZOJ4800】[Ceoi2015]Ice Hockey World Championship (meet in the middle)
[BZOJ4800][Ceoi2015]Ice Hockey World Championship (meet in the middle) 题面 BZOJ 洛谷 题解 裸题吧,顺手写一下... #i ...
- 【CF888E】Maximum Subsequence(meet in the middle)
[CF888E]Maximum Subsequence(meet in the middle) 题面 CF 洛谷 题解 把所有数分一下,然后\(meet\ in\ the\ middle\)做就好了. ...
随机推荐
- ionic3 细节注意
一.图标和splash大小不一样 icon图标的大小尽量为1024*1024,并且不能为圆角. splash图片的大小尽量为2732*2732,ionic1的大小为2208*2208
- Android开发常用的一些功能列表(转)
文章来源:http://www.cnblogs.com/netsql/archive/2013/03/02/2939828.html 1.软件自动更新下载,并提示 2.软件登录注册,以及状态保存 3. ...
- Python:BeautifulSoup移除某些不需要的属性
很久之前,我看到一个问题,大概是: 他爬了一段html,他获取下了所需的部分(img标签部分),但是不想保留img标签的某些属性, 比如 <img width="147" h ...
- python正则表达式模块re:正则表达式常用字符、常用可选标志位、group与groups、match、search、sub、split,findall、compile、特殊字符转义
本文内容: 正则表达式常用字符. 常用可选标志位. group与groups. match. search. sub. split findall. compile 特殊字符转义 一些现实例子 首发时 ...
- 使用openssl在windows 10下本地xampp配置https开发环境
安装win64OpenSSL-1_1_0j后重新启动:以管理员权限启动powershell; 执行以下命令 set OPENSSL_CONF=c:\xampp\apache\conf\openssl. ...
- [20171113]修改表结构删除列相关问题2.txt
[20171113]修改表结构删除列相关问题2.txt --//测试看看修改表结构删除列产生的redo向量,对这些操作细节不了解,分析redo看看. 1.环境:SCOTT@book> @ &am ...
- 20个最常用的Windows命令行
1. 中断命令执行Ctrl + Z 2. 文件/目录cd 切换目录例:cd // 显示当前目录例:cd .. // 进入父目录 3.创建目录md d:\mp3 // 在C:\建立mp3文件夹md d: ...
- ABAP CDS 替换对象(Replacement Objects)引起的数据错误
最近遇到了一个诡异的问题:从CDS视图中取得的数据,和从透明表中取得的数据,会有不同的值.在这里记录下问题的表现和解决方案,以供参考. 系统版本:S/4HANA OP1610 涉及表:MCHB 本文链 ...
- hadoop系列 第一坑: hdfs JournalNode Sync Status
今天早上来公司发现cloudera manager出现了hdfs的警告,如下图: 解决的思路是: 1.首先解决简单的问题,查看警告提示的设置的阀值时多少,这样就可以快速定位到问题在哪了,果然Journ ...
- St_geometry 初始用
数据准备 点表 CREATE TABLE point_stgeom tablespace UBOSS_STS_WAREHOUSE as select car_number, longid, latid ...