上一页 1 ··· 17 18 19 20 21 22 23 24 25 ··· 85 下一页
  2012年5月31日
摘要: SPOJ_2916 这个题目需要分情况讨论一下,如果y1<x2,那么就是前面区间的一个后缀,加上后面区间的一个前缀,再加上中间的部分,如果y1>=x2,则根据位置的不同又可以另分三种情况,逐一讨论并更新最优解即可。 分析之后就发现,在线段树的基础上写两个查询函数即可,一个就是和SPOJ_1716的GSS1那样功能的函数(在我的程序里面对应的是query这个函数),另一个是可以求一个区间最大的前缀和或者后缀和的函数(在我的程序里面对应的是Search这个函数)。#include<stdio.h>#include<string.h>#define INF 0x3 阅读全文
posted @ 2012-05-31 21:02 Staginner 阅读(227) 评论(0) 推荐(0) 编辑
  2012年5月30日
摘要: SPOJ_2713 查询区间和很容易用线段树实现,而开方操作乍一看是没法用下传lazy标记的办法实现的,但仔细想一下,实际上每个数最多被开方的次数也是很有限的,只要最后开成1或者0,那么之后都不会再变了。 因此我们可以用一个finish标记表示当前区间内是否还有数在开方后发生变化,如果有的话finish为0,否则为1,每次开方都沿finish为0的区间更新到底,由于被开方次数有限,所以整体的复杂度还是可以承受的。#include<stdio.h>#include<string.h>#include<math.h>#define MAXD 100010long 阅读全文
posted @ 2012-05-30 15:17 Staginner 阅读(133) 评论(0) 推荐(0) 编辑
摘要: SPOJ_1716 这个题目和SPOJ_1043的GSS1是类似的,只不过增加了单点修改的功能。用线段树实现相应的功能即可。#include<stdio.h>#include<string.h>#define MAXD 50010#define INF 0x3f3f3f3f3f3f3f3fllint N, M, a[MAXD];long long lc[4 * MAXD], rc[4 * MAXD], mc[4 * MAXD], sum[4 * MAXD];long long Max(long long x, long long y){ return x > y 阅读全文
posted @ 2012-05-30 13:50 Staginner 阅读(247) 评论(0) 推荐(0) 编辑
摘要: HNU_12309 除去长度为L的木板,这个题目就可以看成4种物品装入背包,问最少几个背包能够装下。 在划分阶段的时候如果按一个背包一个背包装的话,这样决策的选择就会变得很多,而如果按一个物品一个物品去装的话,那么决策就很少了。 在记录状态的时候必然要纪律剩余物品的情况,于是不妨开一个四维数组f[i][j][k][l],表示剩余的物品数分别为i、j、k、l时最少需要的背包数,但只记录这些信息还是不够的,我们还需要当前在装的这个背包还剩余多少容量,于是可以再开一个四维数组g[i][j][k][l],表示在背包数量最少的前提下,当前背包剩余的最大容量是多少。 在决策的时候,只要分别对4种物... 阅读全文
posted @ 2012-05-30 12:05 Staginner 阅读(158) 评论(0) 推荐(0) 编辑
  2012年5月26日
摘要: URAL_1149 根据通项公式找到递推式之后就可以递归打印任意的An及Sn了。#include<stdio.h>#include<string.h>int N;void dfsA(int n, int up){ if(n == 1) { printf("sin(%d)", up); return ; } printf("sin(%d%c", up - n + 1, (up - n + 1) & 1 ? '-' : '+'); dfsA(n - 1, up); printf(")& 阅读全文
posted @ 2012-05-26 20:45 Staginner 阅读(148) 评论(0) 推荐(0) 编辑
  2012年5月24日
摘要: HDU_4012 这个题目可以用BFS加一些剪枝搜过去。 首先状态可以用0、1表示该位是否涂上了正确的颜色,这样状态总数不超过2^16。接下来就要枚举每次涂的矩形的位置以及颜色了,在枚举的时候要加一些剪枝。 涂的矩形无非有两种情况,要么是一行,要么是两行。 如果是一行的矩形,那么两端的正确颜色要一致,而且两端都未涂上正确颜色,否则这个矩形是没有必要涂的。 如果是两行的矩形,那么左端的上下两个位置中至少应有一个是未涂上正确颜色的,而且这个矩形所涂的颜色应为这两个位置中尚未涂上正确颜色的位置的正确颜色,否则这个矩形是没有必要涂的。 除此之外还有其他一些剪枝。#include<stdio.h. 阅读全文
posted @ 2012-05-24 03:32 Staginner 阅读(411) 评论(0) 推荐(0) 编辑
  2012年5月23日
摘要: POJ_3522 这个题目我们可以枚举每条边作为生成树中权值最小的边,然后做最小生成树,不过我们这样去写,不知道会不会超时。 也可以在做kruscal的时候,如果加上当前边会构成环,那么就将这个环上权值最小的边删掉。同时如果当前已经形成了最小生成树,就遍历一遍生成树,找到边权的最大值和最小值更新一下结果。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 110#define MAXM 10010#define INF 0x3f3f3f3fusing namespace std 阅读全文
posted @ 2012-05-23 15:44 Staginner 阅读(188) 评论(0) 推荐(0) 编辑
摘要: POJ_1679 这个题目可以先用prim求一棵最小生成树,然后顺便更新出书上两点间的最大边权。 之后枚举每一条边,如果这条边没有在生成树上,且生成树上这两点间的最大边权与之相等,那么就说明这条边也可以作为最小生成树边,因此最小生成树就不唯一了。#include<stdio.h>#include<string.h>#define MAXD 110#define MAXM 100010#define INF 0x3f3f3f3fint N, M, first[MAXD], e, next[MAXM], v[MAXM], dis[MAXD], pre[MAXD], vis[ 阅读全文
posted @ 2012-05-23 13:51 Staginner 阅读(162) 评论(0) 推荐(0) 编辑
  2012年5月22日
摘要: POJ_3621 首先,符合要求的环一定是一个简单环,不妨假设最优路线是由两个简单环x、y组成。如果x的平均值和y的平均值一样,那么选择x或y中任意一个简单环都是满足要求的,如果x的平均值和y的平均值不一样,那么加权之后一定比较大者要小,因此一定会挑那个平均值较大的简单环作为最优解。因此最终最优路线一定是简单环。 接着就可以像求解最优比率生成树那样用0-1分数规划求解了,需要注意为了能够转化成求最短路、判负圈去解,那么0-1分数规划的表达式最终一定要变形成求某个表达式最小值的形式,这样每次二分的时候再依据这个表达式重新对边权赋值后求判负圈即可。#include<stdio.h>#i 阅读全文
posted @ 2012-05-22 18:36 Staginner 阅读(297) 评论(0) 推荐(0) 编辑
摘要: ZOJ_2676 这个题目可以像最优比率生成树那样用0-1分数规划去做,只不过最优比率生成树每次是求一棵生成树,而这个题目要求一个最小割。 对于每次二分,在建图的时候可能会出现边权为负的边,由于通过分析后可知这些边一定会选,所以就没必要再将其加入到新建的图中了。 最后要输出最小割集,求最小割集的时候可以用DFS遍历做完最大流之后的图,且只能沿没有满流的边向下走。遍历完成后,如果某条边有一个端点遍历到了而另外一个端点没有遍历到,那么就说明这条边是属于最小割集中的。#include<stdio.h>#include<string.h>#include<algorith 阅读全文
posted @ 2012-05-22 16:08 Staginner 阅读(391) 评论(0) 推荐(0) 编辑
上一页 1 ··· 17 18 19 20 21 22 23 24 25 ··· 85 下一页