P3067 [USACO12OPEN]平衡的奶牛群(折半暴搜)

暴搜无疑....
首先考虑纯暴搜......
考虑每一个数:
- 选在左边集合
- 选在右边集合
- 不选
一共三种情况,用一个数组记录搜到的答案,所以暴搜是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]平衡的奶牛群(折半暴搜)的更多相关文章
- 洛谷 P3067 [USACO12OPEN]平衡的奶牛群Balanced Cow S…
P3067 [USACO12OPEN]平衡的奶牛群Balanced Cow S… 题目描述 Farmer John's owns N cows (2 <= N <= 20), where ...
- P4799 [CEOI2015 Day2]世界冰球锦标赛(折半暴搜)
题目很明确,不超过预算的方案数.两个直觉:1.暴搜2.dp 每个点两种状态,选或不选.... 1.可过20% 2.可过70% 正解:折半搜索(meet in the middle) 有点像以前的双向广 ...
- 洛谷P3067 平衡的奶牛群 [USACO12OPEN] meet-in-the-middle
正解:搜索 解题报告: 先放下传送门QwQ 这题就,双向搜索经典题鸭 首先dfs应该挺好想到的我jio得?就是我们不用记录左右分别得分多少只要记下差值就好了嘛能get? 然后就先搜左边,记录下每个得分 ...
- TYVJ 1340 折半暴搜+二分
思路: 1. 这 题 不卡常过不去啊-- (先加一个random_shuffle) 首先 我们可以折半 搜这一半可以到达的重量 sort一遍 然后搜另一半 对于路程中每一个解 我们可以二分前一半中加这 ...
- BZOJ 4800 折半暴搜
思路: 把它拆成两半 分别搜一发 两部分分别排好序 用two-pointers扫一遍 就可以了. (读入也要用long long) //By SiriusRen #include <cstdi ...
- POJ 3188暴搜
题意: 思路: 裸的暴搜 --. 但是要注意如果你不用所有的按键就能输出最优解的话一定要把所有的字母都安排到一个位置-. 我的一群PE就是这么来的-- 为什么写的人这么少-- // by Sirius ...
- 【BZOJ-3033】太鼓达人 欧拉图 + 暴搜
3033: 太鼓达人 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 204 Solved: 154[Submit][Status][Discuss] ...
- c++20701除法(刘汝佳1、2册第七章,暴搜解决)
20701除法 难度级别: B: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 输入正整数n,按从小到大的顺序输出所有 ...
- 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 ...
随机推荐
- 题解:2018级算法第二次上机 Zexal的竞赛
题目描述: 样例: 实现解释: 一道需要一点思考的动态规划题目 知识点:动态规划,数据记录 首先将题目描述调整:分别输入不同分数的题目总分(便于后续计算),当获得了i分数的总分后无法获得i-1和i+1 ...
- html隐写术,使用摩尔兹电码/莫尔兹电码存储信息 水波纹样式 Morse code
html水波纹样式,源码直接下载,代码有注释教程,小白可以看懂. 动画啥的都做好了,效果我觉得还不错 网上文章看到xbox 工程师使用隐写术,在界面的右下角放上了含有用户激活码的水波纹样式,一般人还真 ...
- 在C#中调用Python中遇到的坑(No module named xxx)
例如Python的代码是这个样子的. # coding=<utf-> # -*- coding: utf- *- import requests import urllib def Cle ...
- 微信小程序与用户交互
微信小程序与用户交互 一.显示消息提示框 wx.showToast({属性名:属性值}) 自定义一个提示框,时间到了会自动关闭 wx.showToast({ title:"成功", ...
- Win10安装gcc、g++、make
下载安装包: 1. MinGW官网下载:http://www.mingw.org 点击右上角Downloads 点击下载 mingw-get-setup.exe 2. 百度网盘(2 ...
- 域渗透基础之Windows 2012创建域控制器
创建备份域控制器 这里就拿windows 2012 R2来当备份域控 如果一个域内有多个域控制器,可以有如下好处. 提高用户登录的效率:如果同时有多台域控制器对客户提供服务,可以分担审核用户登录身份( ...
- msf假冒令牌
记录下 msf中令牌假冒的过程 环境 kai Linux 靶机 xp meterpreter得到一个返回的shell,test用户,假设无法提升至管理权限. 使用use incognito命令进入该模 ...
- 常用windows命令
目录 本教程概述 用到的工具 标签 简介 1.cmd的一些规则 2.cd切换目录命令 3.dir显示目录命令 4.type显示文本内容 5.del 删除文件 6.查看IP地址 7.net 命令 8.n ...
- CSS中重要的BFC
CSS中有个重要的概念BFC,搞懂BFC可以让我们理解CSS中某些原本看似诡异的地方. 简介 在解释BFC之前,先说一下文档流.我们常说的文档流其实分为定位流.浮动流.普通流三种.而普通流其实就是指B ...
- USACO环绕岛屿Surround the Islands 并查集 枚举暴力
题目描述 Farmer John has bought property in the Caribbean and is going to try to raise dairy cows on a b ...