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 ...
随机推荐
- win10家庭版升级专业版
在网上随便百度一个产品密钥,记得一定要先断网(这个很重要),否则很难升级. 升级之后发现产品未激活,下载KMS激活一下就可以了.
- jsp隐含对象(内置对象)
JSP共有以下9个内置的对象: request HttpServletRequest类的实例,用户端请求,此请求会包含来自GET/POST请求的参数 response HttpServletRespo ...
- wsgi相关的
目录 web 本质 http协议 请求方式 响应状态码 请求与响应文本格式 目录 web 本质 本质就是浏览器和服务器进行通信, http协议 也叫超文本传输协议(英文:HyperText T ...
- 一种Cortex-M内核中的精确延时方法
本文介绍一种Cortex-M内核中的精确延时方法 前言 为什么要学习这种延时的方法? 很多时候我们跑操作系统,就一般会占用一个硬件定时器--SysTick,而我们一般操作系统的时钟节拍一般是设置100 ...
- 第一次 在Java课上的编程
第一次在java课上的编程(使用参数输入求和): 代码: public class He { public static void main(String[] args) { ...
- stm32填坑之旅 - stm32f103c8t6点亮板载贴片蓝色LED
转载请注明:https://www.cnblogs.com/rockyf/p/11691622.html 开篇 开篇一定要精彩,不然路人不理睬!下述是笔者作为arm小白的填坑之旅 没错,这个之前一直从 ...
- bugku color
下载打开压缩包是七张图片,分别是七个颜色,使用stegsolve打开发现了异常. 七张图片拼起来是 make me tall,看来是要修改图片高度. 我们使用winhex打开图片并在十六进制中修改图片 ...
- mac上git安装与github基本使用
目录 安装git 创建ssh key.配置git 提交本地项目到GitHub 一.安装Git MAC安装Git 首先查看电脑是否安装Git,终端输入: git 1.通过homebrew安装Git 1. ...
- JVM垃圾回收(上)
Java 中的垃圾回收,常常是由 JVM 帮我们做好的.虽然这节省了大家很多的学习的成本,提高了项目的执行效率,但是当项目变得越来越复杂,用户量越来越大时,还是需要我们懂得垃圾回收机制,这样也能进行更 ...
- Neo4j:图数据库GraphDB(三)创建删除及高级操作
本片继续前几篇介绍图数据库的创建,有疑问可以我的看看前两篇文章:http://www.cnblogs.com/rongyux/p/5537206.html 四 图数据库的创建 1 创建一个节点 P ...