上一页 1 ··· 10 11 12 13 14 15 16 17 18 ··· 66 下一页
摘要: A.连续子串和贪心题,枚举每一个数字作为结束点。保留前i位的前缀和sum[i],对于第i为结束的合法序列,其值为sum[i]-sum[i-K],sum[i]-sum[i-K-1],...,sum[i]-sum[0],那么我们只需要对每一个 i 保留sum[0]到sum[i-K]的最小值即可。代码如下:Problem A#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int INF = 0x7ffff 阅读全文
posted @ 2013-04-12 19:52 沐阳 阅读(481) 评论(0) 推荐(1) 编辑
摘要: Description求区间[a,b]包含1的数量。例如区间[111,112], 整个区间包含两个数,分别为111,112,111包含3个1,而112包含2个1,所以区间[111,112]总共包含5个1.Input多组测试数据。每组测试数据包含两个整数a,b, 1 <= a<=b<=10^18.Output每组测试输出一行,表示1的数量,结果mod 10^9+7.Sample Input111 112 1 1000Sample Output5 301代码如下:#include <cstdlib>#include <cstdio>#include < 阅读全文
posted @ 2013-04-11 21:59 沐阳 阅读(357) 评论(2) 推荐(0) 编辑
摘要: 题意:给定两个关系矩阵,分别表示雇主和雇员的相互好感度,好感度为1最优,N最差。如果一个人与好感度为P的人匹配的话,差值为P-1,现在要求是的总共的差值最小的匹配方法,并且输出所有的匹配方案。解法:将两两关系矩阵转化为边上的权值,然后进行一次最大匹配,最后dfs枚举输出结果,数据中给的矩阵上下颠倒了。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <cmath> 阅读全文
posted @ 2013-04-10 23:04 沐阳 阅读(347) 评论(0) 推荐(0) 编辑
摘要: 做这题的时候突然觉得每次修改一次可行标就一定能够找到增广路,因此把while(1)改成了int T = 2; while(T--) {}谁知道WA了,这就比较纠结了,后面手动模拟了一组数据才知道不在交错树的点不一定不在已经存在的匹配中,增加的可行边右端点可能就落在了一条匹配边上,那么这样一来并不能保证找到一条增广路。这样也就解释了为什么对于slack[]数组每次进行一个更新,因为这个值由于循环次数的增加可能多次被利用到,没有找到增广路,那么原来的那条交错树一定还会边遍历一遍,而且会有新的节点加入到S和T集合(其实反正都会遍历一遍,那么不更新slack数组,dfs过程中也会自动缩小)。题意:有N 阅读全文
posted @ 2013-04-10 07:53 沐阳 阅读(366) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一个网格图,图上有一些人要到一些房子当中去,人和房子的数量一样多,人和房子的曼哈顿距离作为行走的开销,问所有人走到房子中的最小开销。解法:将人和房子之间两两之间建立带权边,权值为曼哈顿距离的相反数,这样问题就转化为最大权值匹配问题。代码如下:#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int INF = 0x3f3f3f3f;int N 阅读全文
posted @ 2013-04-09 19:40 沐阳 阅读(285) 评论(0) 推荐(0) 编辑
摘要: //*******************************以下是转载的*******************************************二分图匹配算法总结二分图最大匹配的匈牙利算法二分图是这样一个图,它的顶点可以分类两个集合X和Y,所有的边关联在两个顶点中,恰好一个属于集合X,另一个属于集合Y。最大匹配:图中包含边数最多的匹配称为图的最大匹配。完美匹配:如果所有点都在匹配边上,称这个最大匹配是完美匹配。最小覆盖:最小覆盖要求用最少的点(X集合或Y集合的都行)让每条边都至少和其中一个点关联。可以证明:最少的点(即覆盖数)=最大匹配数最小路径覆盖:用尽量少的不相交简单路 阅读全文
posted @ 2013-04-09 18:07 沐阳 阅读(1377) 评论(3) 推荐(0) 编辑
摘要: 题意:有N件物品和V体积的背包,没见物品由所占空间和价值组成,现问第K大能够装多少物品?解法:通过增加一维信息f[i][j][k]表示占用放到第i件物品时空间为j是第k大值时多少,f[i][j][k]无法给出一个明确的转移的方程,但是我们知道第i件物品若放置的话那么能够由f[i][j-w[i]][1...K]生成K中状态,如果不放置的话就能由f[i][j][0...K]生成K种状态,分别由这2*K个状态能够得到放或者是不放的前K大,因为综合的前K大一定在放的前K大或者是不放的前K大里面。代码如下:#include <cstdlib>#include <cstdio>#i 阅读全文
posted @ 2013-04-09 14:15 沐阳 阅读(283) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一群人的姓名和昵称,给定了一些关系,现在要求判定姓名和昵称能够一一对应的有哪些?解法:一开始直接使用藏匿点的所有人和邮件进行构边,再用删除来判定,结果出错,为什么呢?因为我们将藏匿点的所有人和邮件连边确定的就是一种可能关系,然而题目中还隐藏了许多的可能关系,比如某人在藏匿点但是没有发邮件,那么其和其他未出现的昵称之间存在可能关系。正确的解法是确定不可能关系,因为这样更加简单,在藏匿点外的人不可能与邮件有关系。初始化所有人和所有昵称都有关系,通过排除不可能的关系即确定了可能的关系。之后再枚举每一条边,将其删除看通过最大匹配是否减小来断定这条边是不是被唯一对应。注意:如果某一组名字-昵称 阅读全文
posted @ 2013-04-08 21:09 沐阳 阅读(510) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一个网格,现在某些格子坐标中有一个小行星,现有一种武器能够击穿一行或者是一列的小行星,问最少使用多少次这种武器能够销毁所有的小行星。解法:由于每一个点只要被行或者列覆盖到就可以,因此可以将某一点所在的行和列进行匹配,问题就转化为求一个最小顶点覆盖就可以了,因为这样能够保证每一条边都有一个顶点在点集内。也即每个小行星都能够被所在的行或者是所在的列覆盖到。代码如下:#include <iostream>#include <cstring>#include <cstdio>#include <cstdlib>#include <algo 阅读全文
posted @ 2013-04-08 18:28 沐阳 阅读(252) 评论(0) 推荐(0) 编辑
摘要: 题意:有N个十字路口,这些十字路口通过M条路连接,边是单向的,现在要派一些伞兵去空袭这些十字路口,每个伞兵可以沿着一条路空袭沿路的十字路口,问最少要派出多少伞兵。解法:对于有向无环图求最小的路径覆盖数相当于将原图中的点拆开后,求一个最大匹配数,然后用顶点数减去最大匹配数就是最小路径覆盖了。代码如下:#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int N, M 阅读全文
posted @ 2013-04-08 13:46 沐阳 阅读(205) 评论(0) 推荐(0) 编辑
上一页 1 ··· 10 11 12 13 14 15 16 17 18 ··· 66 下一页