暴搜无疑....

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

考虑每一个数:

  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. 深入了解opacity和rgba

    1. rgba 首先它是一个属性值,语法为rgba(r,g,b,a) - r为红色值, 正整数 | 百分数 - g为绿色值,正整数 | 百分数 - b为蓝色值,正整数 | 百分数 - a为alpha( ...

  2. Java中NIO及基础实现

    NIO:同步非阻塞IO 来源:BIO是同步阻塞IO操作,当线程在处理任务时,另一方会阻塞着等待该线程的执行完毕,为了提高效率,,JDK1.4后,引入NIO来提升数据的通讯性能 NIO中采用Reacto ...

  3. Java集合总结—再也不怕面试问到集合了

    Java集合总结 1.常见的集合 Map接口和Collection接口是所有集合框架的父接口: Collection接口的子接口包括:Set接口和List接口 Map接口的实现类主要有:HashMap ...

  4. MQ相关面试题

    如果你的简历中有写到MQ,那么面试官一般会问到如下几个问题,至少我在面试中经常常被问到,所以今天总结一下,有不对的地方还望多多包涵: 首先第一个问题,为什么要用MQ? 如果这个问题你都没考虑过,那么说 ...

  5. unittest介绍

    unittest框架是python中一个标准的库中的一个模块,该模块包括许多的类如 test case类.test suit类.texttest runner类.texttest resuite类.t ...

  6. 《深入理解Java虚拟机》-----第13章 线程安全与锁优化

    概述 在软件业发展的初期,程序编写都是以算法为核心的,程序员会把数据和过程分别作为独立的部分来考虑,数据代表问题空间中的客体,程序代码则用于处理这些数据,这种思维方式直接站在计算机的角度去抽象问题和解 ...

  7. PowerSploit-CodeExecution(代码执行)脚本渗透实战

    首先介绍一下国外大牛制作的Powershell渗透工具PowerSploit,上面有很多powershell攻击脚本,它们主要被用来渗透中的信息侦察.权限提升.权限维持. 项目地址:https://g ...

  8. [NOIp2009] luogu P1071 潜伏者

    翘课间操和体育课来水博客. 题目描述 CCF的题面贼长,但貌似除了背景以外,每句话都删不掉.不写啦,反正也是Ctrl C的. Solution 显然这是一道码农题. #include<cstdi ...

  9. [JZOJ5185] 【NOIP2017提高组模拟6.30】tty's sequence

    Description

  10. [HNOI2007] 理想正方形 二维ST表

    题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至 ...