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\)做就好了. ...
随机推荐
- canvas纯绘制雨伞、飞机、五角星、桃心,无逻辑
由于网上很多都是用很多算法和逻辑使用canvas进行绘制,但有时也无法解决一些小众需求 . 为了满足需求不能写运算纯手写,感觉真的很浪费时间,只有自己踩过的坑,才不想看到别人也被坑.我很懒,也想过弄个 ...
- nginx的应用(window环境下)
nginx(背景) nginx是一个高性能的HTTP服务器,以前我经常在linux系统中配置,主要做反向代理和负载均衡,最近根据业务需要,需要在window中配置反向和负载,下面就介绍一下nginx的 ...
- 记录C/C++中遇到的一些小问题
1. printf 比如 char a = \x90; printf("%02x", a); 想输出为90,没想到却是ffffff90,这个问题害我一个程序老是出错 最终发现只要改 ...
- 跨站请求伪造(CSRF)
1. 什么是跨站请求伪造(CSRF) CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者session Riding,通常缩 ...
- Python不可变对象
str是不变对象,而list是可变对象. 对于不可变对象,比如对str进行操作: # 对于list进行操作,list内部的内容是会变化的: >>> a = ['c', 'b', 'a ...
- nginx配置基于域名、端口、IP的虚拟主机
1.基于域名的虚拟主机: 绝大多数企业对外提供服务的网站使用的都是基于域名的主机,通过不同的域名区分不同的虚拟主机. 首先我们进入安装nginxd的目录下:/application/nginx-1.6 ...
- [Hive_add_2] Hive 数据类型
Hive 数据类型 正常数据类型 # 整型,4个字节 int # 大整型,8个字节 bigint # 字符串,最大长度2G String 复杂数据类型 # 数组,相同类型元素的数组 array< ...
- nginx ssl 自签证书实验
两台服务器 11.11.11.3 (生成证书然后到CA服务上注册) 11.11.11.4 (nginx服务.CA证书签发) 1.建立CA服务器(11.3) .在CA上生成私钥文件 在/e ...
- ccf--20151203--画图
本题思路如下: 题目和代码如下: 问题描述 试题编号: 201512-3 试题名称: 画图 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 用 ASCII 字符来画图是一件有趣 ...
- Linux 小知识翻译 - 「Linux之父 Linus」
作为新年的第一次,这次想简单介绍下Linus这个人.(这篇文章是作者新年初写的,所以有这么句话) Linux之父,同时也是现在linux内核开发最终决定的人物就是「Linus Torvalds」.「L ...