02 2016 档案

摘要:这道题的意思是给你一个图, 有点权和边权, 你的任务是求一个圈, 使得这个圈的点权和比边权和最大,我们依然可以使用01规划的知识, 将一条边的权值变为ai-mid*bi, 看看这个图里面有没有正环, 有的话说明还存在更优的解, 这里的正环问题可以将边权值取反变成负环问题, 代码如下: #includ 阅读全文
posted @ 2016-02-29 21:55 xing-xing 阅读(241) 评论(0) 推荐(0)
摘要:这个题的意思是给你一个连通图, 图上每个点都有连个权值ai, bi让你选一个生成树使得sigma(ai*xi)/sigma(bi*xi)最小, 对比与基础的01规划, 我们假设答案是mid, 然后建立一个图, 其新的边的权值是ai-mid*bi, 然后求解最小生成树,假设其答案是tp, 如果tp>= 阅读全文
posted @ 2016-02-29 20:30 xing-xing 阅读(451) 评论(0) 推荐(0)
摘要:这个题算是01分数规划的最基本的应用了, 01分数规划是给你n对数(a1, b1)....(an, bn), 然后让你选择一些数对, 使得sigma(ai)/sigma(bi)最大。这里附上讲解一份, http://blog.csdn.net/hhaile/article/details/88836 阅读全文
posted @ 2016-02-28 14:31 xing-xing 阅读(253) 评论(0) 推荐(0)
摘要:这道问题是求1-N的次短路的长度,我们直接在dist[maxn][2]上加1维更新即可, 代码如下: #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <queue> using 阅读全文
posted @ 2016-02-28 12:24 xing-xing 阅读(315) 评论(0) 推荐(0)
摘要:这道题就是让你求出有向图中最短路和比最短路长1的路的数量, 我们求出次短路和最短路的数量即可解决这道题 /* 求s到t的最短路与次短路(这里要求只比最短路多1)的条数之和 联想到最小,次小的一种更新关系: if(x<最小)更新最小,次小 else if(==最小)更新方法数 else if(x<次小 阅读全文
posted @ 2016-02-28 11:41 xing-xing 阅读(1962) 评论(1) 推荐(1)
摘要:这个题就是让你求出S点到T点的第K短路, 使用A*搜索就可以, 搜索使用两个指标函数 h g, h表示从源点到当前点的最短路, g点表示从当前点到汇点的最短路, 搜索的时候v顶点第k次出队时的h就是第k短路的长度, 代码如下: #include <cstdio> #include <cstring> 阅读全文
posted @ 2016-02-28 09:39 xing-xing 阅读(307) 评论(0) 推荐(0)
摘要:这个题的意思是是给你一串珠子, 珠子可以绕中心旋转, 也可以轴对称, 问用三种颜色染这一串珠子有几种情况? 首先我们可以知道这个置换群中有2n个元素, 当n为奇数的时候为n*3^(n/2+1), 当n为偶数的时候分两种情况n/2*(3^(n/2)+3^(n^2+1)), 当旋转的时候有 sigma( 阅读全文
posted @ 2016-02-27 22:39 xing-xing 阅读(602) 评论(0) 推荐(0)
摘要:题意是有k个物品, 每个物品b[i]个, 且每个物品重a[i], 求从这些物品中取出的物品总重为n的方案数, 典型的求解多重集组合数, 代码如下: #include <algorithm> #include <cstring> #include <iostream> using namespace 阅读全文
posted @ 2016-02-25 16:52 xing-xing 阅读(479) 评论(0) 推荐(0)
摘要:题意是给你n个物品, 每个物品有ai个, 从中选取m个物品的排列数是多少??这个问题可以使用指数型母函数来解决。。代码如下: #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> using nam 阅读全文
posted @ 2016-02-25 16:27 xing-xing 阅读(271) 评论(0) 推荐(0)
摘要:这个题的意思是给你1^2 2^2 3^2 ... 17^2这17个数, 为你组成i的方案数有多少个, 可以通过普通母函数来求解, 系数就代表方案数, (1+x+x^2+...x^300)(1+x^2+)..., 代码如下: #include <iostream> #include <algorith 阅读全文
posted @ 2016-02-25 14:45 xing-xing 阅读(374) 评论(0) 推荐(0)
摘要:题目大意是给定1 2 5的数量 a, b, c, 问1 2 5不能组成的最小的数是多少?可以使用dp来解决, 定义dp[i][j]为前i种组成j的时候第i中数剩余多少, 那么 dp[i][j] = mi (dp[i-1][j]>=0) -1 (a[i]>j || dp[i][j-a[i]]<=0) 阅读全文
posted @ 2016-02-25 13:57 xing-xing 阅读(328) 评论(0) 推荐(0)
摘要:题意是将一个整数N划分成不超过N个整数的和, 我们定义d[i][j]为j划分成不超过i个整数的和的方案数, 那么d[i][j] = d[i][j-i](全大于0) + d[i-1][j](不全大于0)。 答案就是d[N][N], 代码如下: #include <iostream> #include 阅读全文
posted @ 2016-02-25 01:06 xing-xing 阅读(201) 评论(0) 推荐(0)
摘要:题意是让你求一个最小的N, 使得N!有M个0,N的阶乘中2的因子是远多于5的因子的个数, 因此我们统计出5的个数就知道其后面有几个0,对于一个数mid, mid!中5的因子的个数为mid/5 + mid/25 + mid/5^3 + ... 可以发现mid越大mid!中的5的个数越多, 因此我们可以 阅读全文
posted @ 2016-02-24 22:53 xing-xing 阅读(379) 评论(0) 推荐(0)
摘要:这个题的意思是给你两个数m, k, 让你求出与m互质的第k个数, 设想对于一个数r,我们可以求出小于等于r与m互质的数的个数, 那么我们就可以使用二分很快的求解。 假设我们把m唯一分解 m = p1^a1 * p2^a2 * ... * pi^ai, 那么小于等于r与m互质的数中不应该有p1 p2 阅读全文
posted @ 2016-02-24 21:33 xing-xing 阅读(371) 评论(0) 推荐(0)
摘要:这个题的意思是给你n+1个数, a1 a2 ... an an+1 其中 1<=ai<=M i!=n+1 an+1 = M, 求解存在x1..xn+1使x1*a1+x2*a2+x3*a3+..+xn+1*an+1 = 1的a序列的个数, 由数论部分知识我们可以知道上式要满足就得使(a1, a2, a 阅读全文
posted @ 2016-02-24 16:48 xing-xing 阅读(365) 评论(0) 推荐(0)
摘要:这道题的本质是将n个物品分成k堆, 每堆物品个数大于0小于等于m的方案数。 我们定义d[i][j]为前i堆物品总数为j的方案数, 那么d[i][j]的求解方法如下:其可化为d[i][j] = d[i][j-1] + d[i-1][j-1]+d[i-1][j-1-m]. 初始条件为d[0][0] = 阅读全文
posted @ 2016-02-24 14:11 xing-xing 阅读(859) 评论(0) 推荐(0)
摘要:错排问题简单的理解就是{123..n}的排列中每个数字都不在原来位置上的排列, 设Dn为n个元素错排的数量, 那么Dn = (n-1)*(Dn-1+Dn-2)。其中D1=0, D2=1。关于错排的另外一个数学表达式就是n!*(1-1/1!+2/2!+...+(-1)^n/n!)。。这一题就是求Dn直 阅读全文
posted @ 2016-02-23 13:19 xing-xing 阅读(126) 评论(0) 推荐(0)
摘要:这个题目的意思是给你一串没有重复且递增的只包含a-z的字符串, 让你求出这个字符串排在第几位。 经过思考我们可以得出长度为n的字符串的个数为C(26, m), 然后我们要统计长度和给定的字符串相同但是字典序小于给定的字符串的个数。 对于一个序列a1a2...an来说, 我们逐个位置统计, 设xi为从 阅读全文
posted @ 2016-02-23 12:29 xing-xing 阅读(299) 评论(0) 推荐(0)
摘要:首先我们知道对于一个数x, 他的约数之积可以表示为f(x) = x^(d(x)/2) 其中d(x)为x的约束的个数。 当x很大的时候d(x)会变的非常大,很难将确切的d(x)算出来, 费马小定理告诉我们当p是质数的时候a^p = a(mod p), 当a与p互质的时候式子就变成了a^p-1 = 1 阅读全文
posted @ 2016-02-20 17:20 xing-xing 阅读(375) 评论(0) 推荐(0)
摘要:现在我们有x = b1(mod m1), x = b2(mod m2) ... x = bn(mod mn) 求解一个最小的使其满足上述方程,我们首先考虑x = b1 (mod m1), x = b2 (mod m2)这两个方程, 如果我们用这两个方程求出了一个解x0, 那么其一个解为x = x0 阅读全文
posted @ 2016-02-20 14:22 xing-xing 阅读(1057) 评论(0) 推荐(0)
摘要:基础知识: 1.对于任意的ax+by=c, 如果我们知道有一组解x0, y0; 那么 x1 = x0+kb'(b'=b/gcd(a,b)), y1 = y0-ka'(a'=a/gcd(a,b)); 求解ax + by = c 的过程如下: 1.首先我们利用Egcd求出ax+by=g(g = gcd( 阅读全文
posted @ 2016-02-14 22:53 xing-xing 阅读(6843) 评论(0) 推荐(0)
摘要:这时一个dp问题, 我们定义f[i, j]为用i个点组成高度不超过j的二叉树的数量, 那么f[i][j] = sigma(f[k, j-1]*f[i-1-k, j-1]) 1<=k<=i-2; 边界条件是: f[1][j]=1; 代码如下: /* ID: m1500293 LANG: C++ PRO 阅读全文
posted @ 2016-02-12 15:07 xing-xing 阅读(508) 评论(0) 推荐(0)
摘要:#include <cstdio> #include <algorithm> #include <cstring> #include <iostream> using namespace std; int partner[100]; int N; int total; void dfs() { in 阅读全文
posted @ 2016-02-12 12:08 xing-xing 阅读(126) 评论(0) 推荐(0)
摘要:字符矩阵顺时针旋转90度的时候, 行变成列, 列变成行。 镜面对称不是很难直接上测试代码: #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; char 阅读全文
posted @ 2016-02-12 11:24 xing-xing 阅读(621) 评论(0) 推荐(0)
摘要:这个问题可以使用dp来统计, 假设我们要统计s中连续的a的数量, 那么我们可以定义f[i]为以i结尾连续的a的个数, 那么我们可以定义如下递推式 , if s[i]=='a' then f[i] = f[i-1] + 1; else f[i]=0; 这样就统计了出来, 我们也可以定义以i为开头的连续 阅读全文
posted @ 2016-02-12 10:25 xing-xing 阅读(370) 评论(0) 推荐(0)
摘要:没理解 阅读全文
posted @ 2016-02-10 23:00 xing-xing 阅读(157) 评论(0) 推荐(0)
摘要:这个题就是求最短路径, 然而还有一些限制条件就是最短路一样的时候顶点的欢乐值要最大, 欢乐值一样的时候路径上顶点的个数要最小(不包括源点), 另外要顺带求出最短路径的个数。 实现的时候我们可以用优先队列来优化dijkstra算法, 每更新一个数值其他的也要相应的更新, 另外在求解路径个数的时候假设我 阅读全文
posted @ 2016-02-10 16:51 xing-xing 阅读(205) 评论(0) 推荐(0)
摘要:首先将矩形离散化成一系列线段, 这里以横边为例, 我们将横边离散化之后按照纵坐标排序, 纵坐标相同的时候始边在前。 然后对于一个线段,对应区间的pos[j]++, 如果pos[j]由0-》1 或者由 1 -> 0那么ans++. 这个过程还可以使用线段树优化, 代码如下: /* ID: m15002 阅读全文
posted @ 2016-02-10 16:40 xing-xing 阅读(312) 评论(0) 推荐(0)
摘要:这道题是最小表示法的一个应用, 代码如下: /* ID: m1500293 LANG: C++ PROG: hidden */ #include <cstdio> #include <algorithm> #include <cstring> using namespace std; char s[ 阅读全文
posted @ 2016-02-10 16:37 xing-xing 阅读(229) 评论(0) 推荐(0)
摘要:这道题的难点在于将点拆分, 无向图变为有向图, 对于 i点我们可以将这个点拆分成2*i-1 -> 2*i,权值为1 对于i - j, 我们可以将点拆分以后再添加2*j -> 2*i-1 2*i -> 2*j-1,权值为inf, 然后求解最大流即为要去掉的顶点的个数, 求解具体的边的时候我们可以枚举要 阅读全文
posted @ 2016-02-08 17:37 xing-xing 阅读(370) 评论(0) 推荐(0)
摘要:这道题的意思是到现在理解的不太透彻, 以后需要在看, 先把代码贴上吧 /* ID: m1500293 LANG: C++ PROG: charrec */ #include <cstdio> #include <cstring> #include <algorithm> using namespac 阅读全文
posted @ 2016-02-08 17:30 xing-xing 阅读(147) 评论(0) 推荐(0)
摘要:实例1:(USACO A Game) 有一列数排列, 甲乙两个人每次可以从头或者从末尾取一个数, 问甲乙在采取最优策略的基础下分别分别得分是多少? 这个题带有一丝区间的味道, 因此我们定义dp[i][j]为先取者所能取得的得分, 然后我们思考对于当前的i-j的序列甲先取的话有两种取法, 即1.从头取 阅读全文
posted @ 2016-02-06 23:23 xing-xing 阅读(1553) 评论(0) 推荐(0)
摘要:这道题的意思是平面上有一些点, 这些点从西向东分布,现在选一条路线从最西走向最东 在反过来走, 问选择一条路线走尽可能多的城市, 我们可以将这个问题看成两个人从最西边走向最东边, 定义f[i][j]为1走向i而2走向j的最大城市数,f[j][i] = f[i][j] = max(f[i][k]) + 阅读全文
posted @ 2016-02-05 22:20 xing-xing 阅读(235) 评论(0) 推荐(0)
摘要:这道题是求解几个矩形未被遮挡的面积问题, 可以使用漂浮法来解决, 什么事漂浮法请看这里http://www.nocow.cn/index.php/USACO/window, 代码如下: /* ID: m1500293 LANG: C++ PROG: window */ #include <cstdi 阅读全文
posted @ 2016-02-05 22:08 xing-xing 阅读(351) 评论(0) 推荐(0)
摘要:这一个题就是问你在有树的格子农田里面最大的没有树的方格多大,这道题可以使用动态规划解决,定义dp[i][j]为i j开始的最大方形的边长 那么dp[i][j] = min(dp[i+1][j], dp[i][j+1], dp[i+1][j+1]) + 1, 初识dp[i][j] = 0, 代码如下: 阅读全文
posted @ 2016-02-05 22:04 xing-xing 阅读(200) 评论(0) 推荐(0)
摘要:这个题的意思是有一个有向图, 每个顶点可以发送软件到与其相连的顶点上, 现在问1,至少发送给几个顶点能满足所有顶点都收到软件, 2:如果想让这个图变成强连通图,至少添几条边。 特例是给定的图是一个强连通图的话答案是1, 0. 一般情况下我们先将这个图的强连通分量求出来缩成一个点然后统计入度为0的点和 阅读全文
posted @ 2016-02-03 22:47 xing-xing 阅读(259) 评论(0) 推荐(0)
摘要:const int max_v = 120; struct Scc { int V; //图的顶点数 vector<int> G[max_v]; //原始图 vector<int> rG[max_v]; //反向边的图 vector<int> vs; //后序遍历顶点列表 bool used[max 阅读全文
posted @ 2016-02-03 22:40 xing-xing 阅读(357) 评论(0) 推荐(0)
摘要:刚开始写了一个暴力的dfs超时了, 最后看了下题解说是先枚举答案再判断,然后就写了双dfs,全部秒杀,代码如下: /* ID: m1500293 LANG: C++ PROG: milk4 */ #include <cstdio> #include <cstring> #include <algor 阅读全文
posted @ 2016-02-03 22:39 xing-xing 阅读(533) 评论(0) 推荐(0)
摘要:这个题和传统的走迷宫题非常像, 不同点事这个题选定一个方向后会一直走知道遇到障碍物 走到边缘 或者走到已经走过的点, 我们可以使用dfs来解决这个问题,dfs(x, y, dir, steps)表示从起点到x, y花费的步数, 在搜索的时候把握的一个原则就是每次会走到一个新的格子上。。。代码如下: 阅读全文
posted @ 2016-02-02 17:54 xing-xing 阅读(218) 评论(0) 推荐(0)
摘要:这道题的意思是给你一个长度不超过5000的串, 让你求解一个主题串, 其中主题串的定义是在这个串中重复出现过两次,没有重叠部分, 且两个串各减某个数后序列一样。。我们可以定义dp[i][j]为从i位置和j位置开始相同的串的长度, dp[i][j] = dp[i+1][j+1] + 1; 其中num[ 阅读全文
posted @ 2016-02-02 10:41 xing-xing 阅读(147) 评论(0) 推荐(0)
摘要:这个题就是图像识别类型的模拟题, 我们可以先将每个图像所在的矩形求出来然后在进行比对,实现的时候我们对每个图形进行染色, 记录染色的区域, 在统计一下染色的数目, 那个两个图像相同的充分必要条件就是a的数目等于b的数目,a染色的区域b也染色。代码如下: /* ID: m1500293 LANG: C 阅读全文
posted @ 2016-02-01 21:59 xing-xing 阅读(183) 评论(0) 推荐(0)