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 ...
随机推荐
- asp.net core 自定义中间件【以dapper为例】
在asp.net core开发中.按照国际案例开始.都是先在Nuget安装XXX包.比如我们今天要用到的Dapper nuget里面安装Dapper 1.然后新建一个类文件DapperExtensio ...
- Java8新特性时间日期库DateTime API及示例
Java8新特性的功能已经更新了不少篇幅了,今天重点讲解时间日期库中DateTime相关处理.同样的,如果你现在依旧在项目中使用传统Date.Calendar和SimpleDateFormat等API ...
- python-setup模块
本地打包,setup安装 一.distutils 使用:distutils 进行打包,步骤如下,以单一文件为例. 1.创建文件 在同一目录下.写一个foo.py文件: #-*- coding:utf- ...
- 一文了解 Redis 内存监控和内存消耗
Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多.所以,监控 Redis 的内存消耗并了解 Redis 内存模型对高效并长期稳定使用 Redis ...
- Docker 安装Oracle
1.使用docker 命令搜索oracle 镜像,前提是已安装了Docker docker search oracle 2.下载相应版本的oracle 镜像 docker pull sath89/o ...
- 在C#中调用Python中遇到的坑(No module named xxx)
例如Python的代码是这个样子的. # coding=<utf-> # -*- coding: utf- *- import requests import urllib def Cle ...
- 你也可以写个服务器 - C# Socket学习2
前言 这里说的服务器是Web服务器,是类似IIS.Tomcat之类的,用来响应浏览器请求的服务. Socket模拟浏览器的Url Get请求 首先浏览器的请求是HTTP协议.我们上一篇说过,HTTP是 ...
- 记录JS如何使用广度遍历找到节点的所有父节点
我们在实际的工作业务场景中经常遇到这样的场景,求取树数据中某个节点的父亲节点以及所有的父亲节点,这样的场景下不建议使用深度遍历,使用广度遍历可以更快找到. 1.案例解说 比如树的长相是这样的: 树的数 ...
- Django跨域问题(CORS错误)
Django跨域问题(CORS错误) 一.出现跨域问题(cors错误)的原因 通常情况下,A网页访问B服务器资源时,不满足以下三个条件其一就是跨域访问 协议不同 端口不同 主机不同 二.Django解 ...
- Java编程思想——第17章 容器深入研究 读书笔记(一)
这一章将学习散列机制是如何工作的,以及在使用散列容器时怎么样编写hashCode()和equals()方法. 一.容器分类 先上两张图 来概况完整的容器分类 再细说都为什么会有那些特性. 二.填充容器 ...