摘要: 很黄很暴力的枚举,加上了状态压缩的优化。 用15位的状态压缩木棍,1代表使用,0代表没有使用。然后枚举1~2^15作为一根木棍的组成,取反后的状态为令两根木棍,再枚举这个状态的所有子集,即将它拆成两根木棍。。。然后HASH一下就可以了。 其实是有重复状态的,每种状态都会重复六次。加上一个优化if(len[i]>=len[ii])continue;当第一条边比剩余两条边的和都大的时候就不去枚举剩余两条边的组合,这样效率会高上很多。 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm& 阅读全文
posted @ 2012-09-10 23:43 Burn_E 阅读(218) 评论(0) 推荐(0)
摘要: 把1~N的路径处理出来,算出需要的时间,如果时间不够就直接挂了,时间多的话就可以去用这些时间去拿别的物品了。 对1~N这条路径上的所有点做一遍树形背包,注意背包时不要背到这条路径上的点,否则就重复计算了。最后再将路径上的点用背包合并即可。 不过我这么写效率好像比较慢,跑了150ms+ ,rank上有不少0ms的,应该是有更好的算法。。 1 #include <stdio.h> 2 #include <string.h> 3 #define MAXN 105 4 struct edge{ 5 int v,w,n; 6 }e[MAXN*2]; 7 int first[MAX 阅读全文
posted @ 2012-09-10 23:04 Burn_E 阅读(202) 评论(0) 推荐(0)
摘要: 用一个最小值和最大值来表示每个节点的范围,DFS一遍即可。父亲节点的最小值必然比儿子节点的最小值之和大1(它自身至少要1元),至于最大值,没有什么限制,我一开始一直WA在这里了,因为儿子最大值的和是限制不了父亲节点的,因为父亲节点可以取任意大的值。。最后每个节点的最小值都一定小于等于最大值才会是正确的。。 1 #include <stdio.h> 2 #include <string.h> 3 #define MAXN 10005 4 typedef long long LL; 5 const LL INF=100000000000LL; 6 struct edge{ 阅读全文
posted @ 2012-09-10 22:51 Burn_E 阅读(259) 评论(0) 推荐(0)
摘要: 几何模版题。三维凸包+多边形重心+点面距离。模版一拼就过了。 纯模版这种东西就不贴了。。。 阅读全文
posted @ 2012-09-10 22:37 Burn_E 阅读(151) 评论(0) 推荐(0)
摘要: 之前贪心的想法确实是错误的,比赛的时候数据太水了,过了也就没有想那么多了。如果误导了他人,实在是抱歉。 对于每个元素,最坏情况下它只能够到它后面的第9个数字,因为最坏情况下,它后面的四个数字能被它前面的四个数字消掉,这样它就能和原来是它后面的第9个元素相消了,于是我们可以用d[i][st]表示第i个数字,从i开始的10个数字的状态为st时是否可消。之后记忆化搜索即可。 状态转移比较简单,如果st的第1位为0,说明这一位已经被消掉,d[i][st]=dp(i+1,next(st))。如果第1为为1,向后连续找至多五个为1的位,比较是否和第一位数字相同,如果相同,就将st的这两位置为0,然... 阅读全文
posted @ 2012-09-10 22:31 Burn_E 阅读(795) 评论(5) 推荐(1)
摘要: 这么水的一道最短编辑距离DP,比赛的时候居然没有去做。。 很裸的最短编辑距离DP,就是要注意环的问题。因为如果直接copy两遍的话,有可能会将本来是同一个位置的字母使用两次。但是可以发现串的长度只有10,最大的编辑距离不会超过10,当原串长度>2*L时环就没有影响了,因为这时如果环中一个字母被使用两次,那最短编辑距离肯定已经大于L了。 我是长度小于20时暴力枚举,大于30时在原串后面copy原创的前20个字符。 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #de 阅读全文
posted @ 2012-09-10 22:25 Burn_E 阅读(916) 评论(5) 推荐(0)
摘要: 就是一道比较麻烦的模拟题,比赛的时候没有敲,赛后1A了。。 其实主要是输入比较麻烦,买东西合成物品什么的暴力一点也不会出错的。 代码写的后丑,A了之后也懒的改了。。 1 #include <string.h> 2 #include <stdio.h> 3 #include <string> 4 #include <sstream> 5 #include <iostream> 6 using namespace std; 7 struct equip{ 8 string name; 9 int val,type; 10 string m 阅读全文
posted @ 2012-09-10 22:11 Burn_E 阅读(334) 评论(0) 推荐(0)
摘要: 贪心,用set水过。 先按x,后按y排序,都想等时Bob放前面。然后扫一遍遇到Bob就将卡片的y值放入set中,遇到Alice就在集合中找一个能被他覆盖的y最大的数,将它擦去。因为如若能覆盖而不去覆盖了就等于浪费了这个,所以必然选择用掉这张卡片。最后统计一共成功覆盖了多少个即可。 1 #include <string.h> 2 #include <stdio.h> 3 #include <algorithm> 4 #include <set> 5 #define inset multiset<int,greater<int> & 阅读全文
posted @ 2012-09-10 22:07 Burn_E 阅读(151) 评论(0) 推荐(0)
摘要: 根据%k=a中a和k的不同组合建立55棵树状数组,每次修改操作只对其中1棵树状数组进行操作,每次查询对其中10棵树状数组统计增量和。 1 #include <string.h> 2 #include <stdio.h> 3 #define MAXN 50005 4 int n,q,x[MAXN]; 5 int ta,tb,cc,k,op; 6 int c[55][MAXN]; 7 inline void update(int *c,int x,int d){while(x<=n)c[x]+=d,x+=x&-x;} 8 inline int query(in 阅读全文
posted @ 2012-09-10 22:00 Burn_E 阅读(166) 评论(0) 推荐(0)