[算法]折半搜索+数学计数 [题意]给定n个数(n<=20),定义一种方案为选择若干个数,这些数可以分成两个和相等的集合(不同划分方式算一种),求方案数(数字不同即方案不同). [题解] 考虑直接枚举集合的子集,再枚举子集的子集(划分方式),相当于将子集看成天平,枚举子集一些数置左,剩余数置右,则每个数有三种可能:不选,置左,置右. 由此可知,直接枚举集合子集的子集复杂度是O(3^n). 考虑将总集划分成两半,则枚举一半的复杂度为O(3^(n/2)). 得到两半都如何合并? 如果相同集合不同划分…
2679: [Usaco2012 Open]Balanced Cow Subsets Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 462  Solved: 197[Submit][Status][Discuss] Description Farmer John's owns N cows (2 <= N <= 20), where cow i produces M(i) units of milk each day (1 <= M(i)…
[Usaco2012 Open]Balanced Cow Subsets 题目描述 给出\(N(1≤N≤20)\)个数\(M(i) (1 <= M(i) <= 100,000,000)\),在其中选若干个数,如果这几个数可以分成两个和相等的集合,那么方案数加\(1\). 求有多少种选数的方案. 输入输出格式 输入格式: * Line 1: The integer $ N$. * Lines 2..1+N: Line i+1 contains \(M(i)\). 输出格式: * Line 1:…
BZOJ_2679_[Usaco2012 Open]Balanced Cow Subsets _meet in middle+双指针 Description Farmer John's owns N cows (2 <= N <= 20), where cow i produces M(i) units of milk each day (1 <= M(i) <= 100,000,000). FJ wants to streamline the process of milking…
题面:SP11469 SUBSET - Balanced Cow Subsets 题解: 对于任意一个数,它要么属于集合A,要么属于集合B,要么不选它.对应以上三种情况设置三个系数1.-1.0,于是将题目转化 为找出两个集合和为0,将这两个集合合并不重复的为一种答案.考虑折半搜索.搜出前一半和后一半,用哈希表和状态压缩记录 和去重,然后统计答案即可. 时间复杂度为O(6^(N/2)). 代码: #include<cstdio> using namespace std; ,MOD=,max_nu…
[题意]n头牛,其中最高h.给定r组关系a和b,要求满足h[b]>=h[a]且a.b之间都小于min(h[a],h[b]),求第i头牛可能的最高高度. [算法]差分 [题解]容易发现r组关系只能包含或不相交. 先假设所有牛是最高高度. 对于一组关系(a,b)显然只需要让区间[a+1,b-1]整体-1就好了.使用差分维护. 特别判断a=b和a=b+1和多区间LR一样的情况. #include<cstdio> #include<algorithm> #include<cst…
[算法]贪心&&堆 [题解]反过来看就是合并任意两块木板,花费为木板长度之和. 显然从最小的两块开始合并即可,用堆(优先队列)维护. 经典DP问题石子归并是只能合并相邻两堆石子,所以不能贪心. 手写堆版本见http://www.cnblogs.com/onioncyc/p/6212840.html #include<cstdio> #include<algorithm> #include<queue> using namespace std; prior…
[算法]线段树 #include<cstdio> #include<cctype> #include<algorithm> using namespace std; ; ]; int n,q,a[maxn]; int read_t;char c; int read() { read_t=; while(!isdigit(c=getchar())); +c-';}while(isdigit(c=getchar())); return read_t; } void buil…
http://www.lydsy.com/JudgeOnline/problem.php?id=3016 之前yy了一个贪心,,,但是错了,,就是枚举前后对应的字符(前面第i个和后面第i个)然后相同答案就+1,否则不操作.. QAQ 然后看了题解...神.. 首先序列肯定是偶数个,然后..一定有n/2个‘(’,和n/2个‘)’ 那么左边的一定都是‘(’,对于每一个‘(’,右边的一定有一个‘)’,所以我们想到差分,当右边多了‘)’,那么就要累计答案+1,维护一个sum,如果是‘(’就+1,‘)’就…
http://www.lydsy.com/JudgeOnline/problem.php?id=1636 (我是不会说我看不懂题的) 裸的rmq.. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> using namespace std; #define re…