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\)做就好了. ...
随机推荐
- SuperMap iServer 扩展/JAVA API 系列博客整理
转载:http://blog.csdn.net/supermapsupport/article/details/70158940 SuperMap iServer为广大用户提供了整套 SDK,应用开发 ...
- 喜闻乐见-Android简介
本文主要是对Android系统做一个简介,包括其架构.启动流程.沙箱机制.APK.Darlvik以及ART. 1. 架构 Android是基于Linux内核开发出的一个移动操作系统,系统结构大致可以分 ...
- Android基础之6.0系统以上的权限分配
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle saved ...
- linux服务器系统盘坏且系统盘为软raid的修复方法
1 需要换新盘的情况 1.1 一块盘grub损坏修复 一块盘grub损坏修复(可通过另一块盘进入系统的情况).更换硬盘的方式,可以热插拔,也可以服务器断电后更换,但如果是热插拔,可能会导致盘符变更.坏 ...
- SELinux 是什么?
一.SELinux的历史 SELinux全称是Security Enhanced Linux,由美国国家安全部(National Security Agency)领导开发的GPL项目,它拥有一个灵活而 ...
- Gnome增加消息提醒extension ( Fedora 28 )
访问 https://extensions.gnome.org/ 网站(注意:需要安装 chrome-gnome-shell rpm 包来使得系统能与Web Browser进行通信) 安装插件: n ...
- 离群点检测与序列数据异常检测以及异常检测大杀器-iForest
1. 异常检测简介 异常检测,它的任务是发现与大部分其他对象不同的对象,我们称为异常对象.异常检测算法已经广泛应用于电信.互联网和信用卡的诈骗检测.贷款审批.电子商务.网络入侵和天气预报等领域.这些异 ...
- 由内省引出JavaBean的讲解
IntroSpector--内部检查,了解更多细节--内省---JavaBean 一.JavaBean JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用户访问 ...
- nginx+uwsgi+djangos部署项目完整
1.基本信息 Linux 版本:SentOS7.4 Python 版本:3.7.1 2.下载 uWSGI pip3 install uwsgi uwsgi 主要的任务是座位分发路由的服务器. 先写一个 ...
- reorder-list 单链表
题意: 给你一个单链表 a1 a2 a3 a4 a5....an 让你变成 a1 an a2 an-1 a3 an-2 .... 这里牵涉到,单链表的倒置和两个单链表的合并. class Soluti ...