思路: 利用二进制的“开关”特性枚举;
具体为:假设给定集合A大小为n,则想象A = {a[0], a[1], ..., a[n-1]}的每个元素对应一个开关位(0或1),0表示不出现,1表示出现;
当每个元素的开关位的值确定时,就得到一个子集,因此共有2^n-1种情况(全0为空集,这里不考虑);
我们利用区间[1, 2^n-1],该区间上的每一个整数对应一个子集,对应方法是遍历该整数二进制表...
分类:
其他好文 时间:
2015-08-20 13:13:07
阅读次数:
113
二进制枚举即可:#include#include#includeusing namespace std;int cmp(int a,int b){ return a > b;} int main(){ int t; scanf("%d",&t); while(t--){ int ans =...
分类:
其他好文 时间:
2015-08-17 21:32:55
阅读次数:
151
一道很好的最小生成树题目 。 看似非常复杂,其实仔细分析一下算法的复杂度就会发现,如果加入了lrj说的优化,其实复杂度不高 。
就像紫书中说的, 除去购买套餐中的点,剩下的最小边仍然在原始的最小生成树中 。 所以我们用二进制枚举子集的方法枚举所有购买套餐的组合,然后将套餐中的点加入并查集中,再用原始最小生成树中的边补全当前生成树 。
二进制枚举子集的复杂度是2^8 。 补全生成树的复杂度是O...
分类:
其他好文 时间:
2015-08-16 21:25:04
阅读次数:
148
输入n(using namespace std;typedef long long LL;LL a[15];LL gcd(LL a,LL b) //求a和b的最大公约数{ if(b) return gcd(b,a%b); return a;}LL lcm(LL a,LL b) //求a和b的最小公倍...
分类:
其他好文 时间:
2015-08-03 16:45:43
阅读次数:
155
原题:Description在选举问题中,总共有n个小团体,每个小团体拥有一定数量的选票数。如果其中m个小团体的票数和超过总票数的一半,则此组合为“获胜联盟”。n个团体可形成若干个获胜联盟。一个小团体要成为一个“关键加入者”的条件是:在其所在的获胜联盟中,如果缺少了这个小团体的加入,则此联盟不能成为...
分类:
其他好文 时间:
2015-08-02 21:22:57
阅读次数:
151
SRM 661-Medium: BridgeBuildingDiv2
Problem Statement
You have two rows of nodes. Each row contains N nodes, numbered 0 through N-1 from the left to the right.
Within each row, adjacent nodes...
分类:
其他好文 时间:
2015-07-26 00:35:52
阅读次数:
290
每一次比赛的时候脑子都卡顿,
这次更离谱,我竟然二进制枚举边,这么大的复杂度,并且剪不了枝
后来学长说着是道爆搜,搜每一条边,恍然大悟。
只需要剪掉点的度数是奇数的时候,或者他的线上朋友或线下朋友大于等于度数的1/2时候的枝,
跑了15ms#include
#include
#include
using namespace std...
分类:
其他好文 时间:
2015-07-24 14:23:23
阅读次数:
96
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5305
题意:给定N个人和M条朋友关系,是朋友关系的两个人之间有两种联系方式online和offline。使每个人的online的数量和offline的数量相等,求方案数。
分析:由于M
代码:
#include
#include
#include
#include
#include
us...
分类:
其他好文 时间:
2015-07-23 23:46:12
阅读次数:
189
2333.。。 因为TC过少的参与者。加上不断fst 我掉了div2该。幸运的是完成的背div1该。。250水的问题500水的问题。。直接bfs扩展即可了注意判重。 我还用康托展开了真是多此一举。。1000这题理解错题意了。。我说看别人代码怎么看着不正确劲来着只是还是很easy的一道题二进制枚举烧哪...
分类:
其他好文 时间:
2015-07-22 17:48:56
阅读次数:
133
经典的状态压缩DP 。
根据DP的阶段定义,我们需要枚举每一个教师进行递推,但是由于每个教师可以教授的课程是复杂多样的,所以使得状态变得难以转移 。那么要怎么样表示状态呢? 显然增加一两个维度是无法胜任的,所以我们可以用二进制枚举子集的方法,用一个整数通过位运算充当一个集合 。 C++提供的位运算符极像对集合的操作,我们恰好可以利用这一点 。
用d[i][s1][s2]表示考虑了前i个人时的最...
分类:
其他好文 时间:
2015-07-15 22:55:03
阅读次数:
163