暴搜无疑....

首先考虑纯暴搜......

考虑每一个数:

  1. 选在左边集合
  2. 选在右边集合
  3. 不选

一共三种情况,用一个数组记录搜到的答案,所以暴搜是3^N的复杂度...直接死亡

于是讲折半暴搜....

把区间分为两半,对每一半进行dfs,用两个数组(vector)分别记录答案,于是复杂度就是3^(n/2)*2,在n<=20的情况下,能接受。

但是

如果这么简单,那就不是老师找的紫题的风格了....

存储了两个区间的数组,怎么统计答案呢?

话说折半暴搜的难点就在于统计答案了吧.....

对于每个半区间进行排序,然后的暴力?

那不可能,超时不说,还会有重复的记录....

重复是因为:同时可能有一个数存在于左右两个区间中....很尴尬....

这里是这一题的关键,怎么去重。

这里使用了状压的思想,对于每一个搜到底的状态,我们记录一个01串,看哪些数被使用过,然后在统计答案的时候使用vis判重。

这个vis真的是太妙了!!!!

把两个数的状态或起来,看有没有重复使用的状态

(太神了)

if(!vis[a[l].id|b[r].id])
{
ans++;
vis[a[l].id|b[r].id]=;
}

于是,剩下的就是要在数组中寻找那个关键点pos了.

因为排序后数组单调,所以找到这个pos之后,后面所有的答案都可能符合,只要去重就行了。

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=;
int n;
int ans;
int w[maxn<<],vis[<<maxn];
struct node
{
int sum,id;
};
int cnta,cntb;
node a[<<maxn];
node b[<<maxn];
int mid;
void dfs1(int now,int sum,int id)
{
if(now==mid+)
{
a[++cnta].sum=sum;
a[cnta].id=id;
return;
} {
dfs1(now+,sum,id);
dfs1(now+,sum+w[now],id+(<<(now-)));
dfs1(now+,sum-w[now],id+(<<(now-)));
}
}
void dfs2(int now,int sum,int id)
{
if(now==n+)
{
b[++cntb].sum=sum;
b[cntb].id=id;
return;
} {
dfs2(now+,sum,id);
dfs2(now+,sum+w[now],id+(<<(now-)));
dfs2(now+,sum-w[now],id+(<<(now-)));
}
} bool cmp1(node a,node b)
{
return a.sum<b.sum;
}
bool cmp2(node a,node b)
{
return a.sum>b.sum;
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&w[i]);
}
mid=n>>;
dfs1(,,);
dfs2(mid+,,);
sort(a+,a+cnta+,cmp1);
sort(b+,b+cntb+,cmp2);
int l=,r=;
while(l<=cnta&&r<=cntb)
{
while(r<=cntb&&-a[l].sum<b[r].sum)r++;
int pos=r;
while(r<=cntb&&-a[l].sum==b[r].sum)
{
if(!vis[a[l].id|b[r].id])
{
ans++;
vis[a[l].id|b[r].id]=;
}
r++;
}
if(l<cnta&&a[l].sum==a[l+].sum)
r=pos;
l++;
}
printf("%d",ans-);
return ;
}

(完)

P3067 [USACO12OPEN]平衡的奶牛群(折半暴搜)的更多相关文章

  1. 洛谷 P3067 [USACO12OPEN]平衡的奶牛群Balanced Cow S…

    P3067 [USACO12OPEN]平衡的奶牛群Balanced Cow S… 题目描述 Farmer John's owns N cows (2 <= N <= 20), where ...

  2. P4799 [CEOI2015 Day2]世界冰球锦标赛(折半暴搜)

    题目很明确,不超过预算的方案数.两个直觉:1.暴搜2.dp 每个点两种状态,选或不选.... 1.可过20% 2.可过70% 正解:折半搜索(meet in the middle) 有点像以前的双向广 ...

  3. 洛谷P3067 平衡的奶牛群 [USACO12OPEN] meet-in-the-middle

    正解:搜索 解题报告: 先放下传送门QwQ 这题就,双向搜索经典题鸭 首先dfs应该挺好想到的我jio得?就是我们不用记录左右分别得分多少只要记下差值就好了嘛能get? 然后就先搜左边,记录下每个得分 ...

  4. TYVJ 1340 折半暴搜+二分

    思路: 1. 这 题 不卡常过不去啊-- (先加一个random_shuffle) 首先 我们可以折半 搜这一半可以到达的重量 sort一遍 然后搜另一半 对于路程中每一个解 我们可以二分前一半中加这 ...

  5. BZOJ 4800 折半暴搜

    思路: 把它拆成两半  分别搜一发 两部分分别排好序 用two-pointers扫一遍 就可以了. (读入也要用long long) //By SiriusRen #include <cstdi ...

  6. POJ 3188暴搜

    题意: 思路: 裸的暴搜 --. 但是要注意如果你不用所有的按键就能输出最优解的话一定要把所有的字母都安排到一个位置-. 我的一群PE就是这么来的-- 为什么写的人这么少-- // by Sirius ...

  7. 【BZOJ-3033】太鼓达人 欧拉图 + 暴搜

    3033: 太鼓达人 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 204  Solved: 154[Submit][Status][Discuss] ...

  8. c++20701除法(刘汝佳1、2册第七章,暴搜解决)

    20701除法 难度级别: B: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述     输入正整数n,按从小到大的顺序输出所有 ...

  9. Codeforces Round #238 (Div. 2) D. Toy Sum 暴搜

    题目链接: 题目 D. Toy Sum time limit per test:1 second memory limit per test:256 megabytes 问题描述 Little Chr ...

随机推荐

  1. 【原创】(七)Linux内存管理 - zoned page frame allocator - 2

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  2. Nginx常用命令,解决你日常运维的烦恼

    前面,跟大家简单地介绍了负载均衡和Nginx的一些基础配置(Nginx负载均衡配置实例),接下来,跟大家介绍一下Nginx的常用命令,便于日常的运维. 查看原文 停止Nginx的方法 通过之前的学习, ...

  3. 网络下载器 Internet Download Manager v6.35.5 绿色便携版

    Internet Download Manager,简称 IDM,是国外的一款优秀网络下载工具.目前凭借着下载计算的速度优势在外媒网站中均受好评,现在已被多数国人熟知.Internet Downloa ...

  4. 致所有.Net者和有梦想的朋友们 - 共勉

    这篇文章很早就想写的了,主要是人到了一定的年纪,就想唠叨一些看法,认不认可不重要,重要的是生活给予你的酸甜苦辣,你都想一吐为快. 这里主要基于多年来自己的一个行业感受和以及生活感想,唠叨一下工作以及生 ...

  5. markdown公式转为知乎格式

        在知乎中写技术类文章,经常会用到markdown知乎文章可以导入markdown格式,但是不支持Latex公式.知乎大神提供了替代方案: https://zhuanlan.zhihu.com/ ...

  6. DG常用运维命令及常见问题解决

    DG常见运维命令及常见问题解决方法 l> DG库启动.关闭标准操作Dataguard关闭1).先取消日志应用alter database recover managed standby data ...

  7. vue图片点击放大预览

    第一种:viewerjs使用介绍(PC.移动端都兼容) 1.先安装依赖 npm install v-viewer --save 2.main.js内引用并注册调用 //main.js import V ...

  8. 算法学习之剑指offer(二)

    题目1 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. import java.util.Stack; public class Solution { ...

  9. 第3章(1) Linux内核相关概念

    Linux内核的组成 1. Linux内核源代码的目录结构 arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录,如 i386.arm. arm64.powerpc.mips 等.Linu ...

  10. 零基础:如何快速学习JavaScript,html+css技术

    前端开发要学的知识内容涉及的会很宽泛,虽然说主要是HTML.CSS和JavaScript这些基础知识点,但达妹今天想强调一下,学前端开发除了要学这些基础知识外,学员还要在这之上进行延伸和深入的去学,而 ...