洛谷P3067 平衡的奶牛群 [USACO12OPEN] meet-in-the-middle
正解:搜索
解题报告:
先放下传送门QwQ
这题就,双向搜索经典题鸭
首先dfs应该挺好想到的我jio得?就是我们不用记录左右分别得分多少只要记下差值就好了嘛能get?
然后就先搜左边,记录下每个得分的数量
然后再搜右边,每搜出一个ans+=之前左边的可能得分数量
然后就欧克克了!
啊对了,,,还有一个细节卡了我好久QAQ
就是,要判重
因为注意题意它只是问选数的方案
所以我举个eg哦,假如选出了3 3 3 3,那它就会被枚举24=16次
所以为了避免这种情况
就用个状压
就over了!
具体一点细节晚上写趴,,,QAQ
(还有就是,这题有个双倍经验,,,只是好像要加一点儿细节什么的QwQ我有时间把细节什么的补上来QAQ
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rp(i,x,y) for(register ll i=x;i<=y;++i) const ll N=;
ll n,m,as,gg[N],cnta,cntb,l=,r=;
struct node{ll sm,zt;}a[<<N],b[<<N];
bool vis[<<N]; inline ll read()
{
register char ch=getchar();register ll x=;register bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=getchar();
if(ch=='-')ch=getchar(),y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=getchar();
return y?x:-x;
}
void dfs1(ll x,ll y,ll zt)
{
if(x>(n>>)){a[++cnta].sm=y;a[cnta].zt=zt;return;}
dfs1(x+,y,zt);dfs1(x+,y+gg[x],zt|(<<x));dfs1(x+,y-gg[x],zt|(<<x));
return;
}
void dfs2(ll x,ll y,ll zt)
{
if(x>n){b[++cntb].sm=y;b[cntb].zt=zt;return;}
dfs2(x+,y,zt);dfs2(x+,y+gg[x],zt|(<<x));dfs2(x+,y-gg[x],zt|(<<x));
return;
}
inline bool cmp1(node gd,node gs){return gd.sm<gs.sm;}
inline bool cmp2(node gd,node gs){return gd.sm>gs.sm;} int main()
{
n=read();rp(i,,n)gg[i]=read();
dfs1(,,);dfs2((n>>)+,,);
sort(a+,a++cnta,cmp1);sort(b+,b++cntb,cmp2);
while(l<=cnta && r<=cntb)
{
while(a[l].sm+b[r].sm> && r<=cntb)++r;
ll wz=r;
while(r<=cntb && b[r].sm+a[l].sm==){if(!vis[a[l].zt|b[r].zt])vis[a[l].zt|b[r].zt]=,++as;++r;}
if(l<cnta && a[l].sm==a[l+].sm)r=wz;
++l;
}
printf("%lld\n",as-);
return ;
}
这是写了好久还有一个点T了最后吸氧苟过去的代码!
洛谷P3067 平衡的奶牛群 [USACO12OPEN] meet-in-the-middle的更多相关文章
- 洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication【最小割】分析+题解代码
洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication[最小割]分析+题解代码 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流. ...
- 洛谷 P3067 [USACO12OPEN]平衡的奶牛群Balanced Cow S…
P3067 [USACO12OPEN]平衡的奶牛群Balanced Cow S… 题目描述 Farmer John's owns N cows (2 <= N <= 20), where ...
- 洛谷1578:[WC2002]奶牛浴场——题解
https://www.luogu.org/problemnew/show/P1578#sub 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建 ...
- 洛谷1345 [Usaco5.4]奶牛的电信
题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相 ...
- POJ3621或洛谷2868 [USACO07DEC]观光奶牛Sightseeing Cows
一道\(0/1\)分数规划+负环 POJ原题链接 洛谷原题链接 显然是\(0/1\)分数规划问题. 二分答案,设二分值为\(mid\). 然后对二分进行判断,我们建立新图,没有点权,设当前有向边为\( ...
- P3067 [USACO12OPEN]平衡的奶牛群(折半暴搜)
暴搜无疑.... 首先考虑纯暴搜...... 考虑每一个数: 选在左边集合 选在右边集合 不选 一共三种情况,用一个数组记录搜到的答案,所以暴搜是3^N的复杂度...直接死亡 于是讲折半暴搜.... ...
- 洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication
题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相 ...
- 洛谷 P2915 【[USACO08NOV]奶牛混合起来Mixed Up Cows】
类似于n皇后的思想,只要把dfs表示放置情况的数字压缩成一个整数,就能实现记忆化搜索了. 一些有关集合的操作: {i}在集合S内:S&(1<<i)==1: 将{i}加入集合S:S= ...
- 洛谷P13445 [USACO5.4]奶牛的电信Telecowmunication(网络流)
题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相 ...
随机推荐
- HTML input只能输入数字
onkeyup="this.value=this.value.replace(/[^0-9]/g,'')" onafterpaste="this.value=this.v ...
- jdbcType 与 Java type
JDBC Type Java Type CHAR String VARCHAR String LONGVARCHAR ...
- nginx配置语法
http://baijiahao.baidu.com/s?id=1604485941272024493&wfr=spider&for=pc http://blog.csdn.net/h ...
- Messages: No result defined for action cn.itcast.oa.test.TestAction and result SUCCESS
Struts Problem Report Struts has detected an unhandled exception: Messages: No result defined for ac ...
- Extjs 自定义控件
// JavaScript Document Ext.namespace('CRM.Panels'); CRM.Panels.UserDetail = Ext.extend(Ext.Panel,{ w ...
- Python 入门(一)定义字符串+raw字符串与多行字符串
定义字符串 前面我们讲解了什么是字符串.字符串可以用''或者""括起来表示. 如果字符串本身包含'怎么办?比如我们要表示字符串 I'm OK ,这时,可以用" " ...
- 第五篇:浅谈CPU 并行编程和 GPU 并行编程的区别
前言 CPU 的并行编程技术,也是高性能计算中的热点,也是今后要努力学习的方向.那么它和 GPU 并行编程有何区别呢? 本文将做出详细的对比,分析各自的特点,为将来深入学习 CPU 并行编程技术打下铺 ...
- win8.1简单快速安装phpnow的方法
工具/原料 phpnow 1.5.6 管理员身份登陆系统 方法/步骤 下载phpnow 这是必须的,大家可以自行百度下载,然后我们将phpnow放到一个文件夹,可以是根目录,也可以不是,但一定要知 ...
- 【Java nio】buffer
package com.slp.nio; import org.junit.Test; import java.nio.ByteBuffer; /** * Created by sanglp on 2 ...
- Android 动画fillAfter和fillBefore
fillBefore是指动画结束时画面停留在此动画的第一帧; fillAfter是指动画结束是画面停留在此动画的最后一帧. Java代码设置如下: /*****动画结束时,停留在最后一帧******* ...