09 2012 档案

摘要:这题要处理的地方的就是一个人可以同时向多个人传递消息,也就是说一条消息的传递时间由最长的那一条路径所决定,因为可以同时进行嘛,所以就求某一点到所有点的最短路,然后再寻找一条最长的路劲,枚举每个顶点作为起点就可以了。代码如下:#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cs 阅读全文
posted @ 2012-09-27 10:55 沐阳 阅读(177) 评论(0) 推荐(0) 编辑
摘要:给定一些关系,求这样的一个划分,满足以下几点:1、每个组合至少有一个成员;2、每个人只能属于一个组;2、每个组内的成员必须相互认识;3、两个组的成员个数要尽可能的接近。首先由必须两两认识我们可以将有向图转化为无向图,之后,我们如果直接对这个图求连通分量的话,有以下结论,如果连通分量的个数为2的话,那么直接可以划分了,如果超过两个的话那么肯定就是没有结果,也就是无法进行分组。最难处理的就是所有点的连通的话,那么如何去做一个划分呢,这个就和割点有关系了,分离一个割点会产生多个连通分量,这要必须保证那些多出来的要再同一个集合内,这样这个问题就很复杂了。简单的做法是建立一个反图,再对这个反图求一次连通 阅读全文
posted @ 2012-09-24 22:29 沐阳 阅读(512) 评论(0) 推荐(0) 编辑
摘要:对于一个数F,设F = p1^e1*p2^e2...*pn^en 那么[1-N]内与其互质的数和与D = p1*p2*...pn是一致的,因为和F、D互质的数都是不含有他们的素因子的数。对于D这个数求[1-N]内有多少个与其互质的数就可用运用容斥定理来求解了。以6为例,首先计算出与2不互质的数,用等差数列公式能够计算出这些满足于2不互质数的和,接着就加上与3不互质的和,最后再减一次与6不互质的和即可。对于那些改变的数,由于数量不是很多,可以单独拿出来进行处理。代码如下:#include<iostream>#include<cstdio>#include<cstdl 阅读全文
posted @ 2012-09-22 21:21 沐阳 阅读(740) 评论(1) 推荐(0) 编辑
摘要:dp[i]表示第i个位置跳出去的期望天数,先构造出N+1到N+5这几个位置,然后先把dp[N-N+5]这六个位置全部赋值为0,因为这几个位置都已经出去了。然后就是递推了如果该点没有航班的话:dp[x] = (1/6)*(dp[x+1] + dp[x+2] + dp[x+3] + dp[x+4] + dp[x+5] + dp[x+6]) + 1;否则:dp[x] = dp[link[x]]; 其中link[x]表示x连到哪一个点。代码如下:#include<iostream>#include<cstdio>#include<cstdlib>#include&l 阅读全文
posted @ 2012-09-22 21:14 沐阳 阅读(464) 评论(0) 推荐(0) 编辑
摘要:直接枚举等号所在位置,然后左右两边用两个MAP来记录组成和的个数,然后运用乘法原理得到答案。代码如下:#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#include<string>#define 阅读全文
posted @ 2012-09-22 21:07 沐阳 阅读(357) 评论(0) 推荐(0) 编辑
摘要:根据关系建一个图,然后就是后面的插座的传递闭包,一个floyd构边。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <map>#include <string>#define INF 0x3fffffff#define CN(x) (255+(x))#define MN(x) (555+(x))#define MAXN 500using namesp 阅读全文
posted @ 2012-09-20 22:21 沐阳 阅读(389) 评论(0) 推荐(0) 编辑
摘要:每次计算出当前点与第一个点的距离即可。代码如下;#include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>#include<vector>#include<string>#include<math.h>#include<map>#include<set>#include<algorithm>#define MAXN 100000using namespace std;int N, M, cur 阅读全文
posted @ 2012-09-20 21:22 沐阳 阅读(255) 评论(0) 推荐(0) 编辑
摘要:第二次来做这一题,由于题目中给定了一个等级限制M,所以可以通过枚举第一个点所在的位置求解.思路很清晰.for (int i = 0; i <= M; ++i) 这个i来表示第一个点的等级在M长度区间内的偏移量.然后再在区间内建边,floyd即可.代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#define INF 0x3f3f3f3fusing namespace std;int M 阅读全文
posted @ 2012-09-20 16:32 沐阳 阅读(288) 评论(0) 推荐(0) 编辑
摘要:这题是求一个圈中取出若干相邻的数,求其中的最大值,不能够同时取所有的数。本来想着要扩张出一个圈出来,再通过限定长度来转化为线段上的问题,但是这样明显就复杂很多了,有一个结论就是当这个区间在[1-N]之间的话,那么直接输出最大值,否则一定是sum - min[1-N],也就是说如果区间跨越了1,N两个点,那么[1-N]中就一定隐藏了最小子串和。很好理解,因为整个循环串就是由一个最大子串和一个最小子串组成的。线段树的节点中要存储较多的值:lmax -- 从左边开始至少取一个节点的最大值lmin -- 从左边开始至少取一个节点的最小值rmax -- 从右边开始至少取一个节点的最大值rmin -- 从 阅读全文
posted @ 2012-09-20 11:37 沐阳 阅读(237) 评论(0) 推荐(0) 编辑
摘要:依据题中所给定的关系构图,直接网络流。源点到食物,食物到人,人拆成两个点,流量为1,再从人到饮料。代码如下:#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#define INF 0x3fffffff#define F(x) (x)#define N(x) (205+(x))#define CPN(x) (410+(x))#define D(x) (615+(x))using namespace std;int n, f, d, head[1005] 阅读全文
posted @ 2012-09-20 09:31 沐阳 阅读(317) 评论(0) 推荐(0) 编辑
摘要:将gg(n)视为一个未知元,先由1000000007找出循环节222222224,然后再找出g(n)为变量时的循环节183120,然后应用矩阵快速幂求解即可。代码如下:#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector& 阅读全文
posted @ 2012-09-19 15:44 沐阳 阅读(279) 评论(0) 推荐(0) 编辑
摘要:通过离线处理,由于线段树不能够动态的扩张,将所有的数都进行永久标号,无视信息的冗余。对于每一个节点,保留对5取余的所有余数的和值,用long long存储。然后根据元素个数进行更新。代码如下:#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#includ 阅读全文
posted @ 2012-09-19 10:22 沐阳 阅读(270) 评论(0) 推荐(0) 编辑
摘要:题目意思很好懂,就是问最少出来多少个是的队中的每一个人都能够看到最左边或者是最右边。我们通过枚举没一点作为最高点来求解这个问题,有个要注意的地方就是最高点其实允许有两个,即一个往左看,一个往右看。所以我们就只能够去枚举到左边的最高点,通过搜索去找右边的最高点(这个最高点只要满足高度小于等于我们枚举的点即可)。代码如下:#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath 阅读全文
posted @ 2012-09-14 21:18 沐阳 阅读(267) 评论(0) 推荐(0) 编辑
摘要:这题给定一个系列的石头,求去除一些石头后,相邻两个石头的距离最小值最大。一个判定的贪心规则就是当枚举长度为D的时候,那么我们查看[0, 1]的距离是否大于D,如果小于的话,那么就直接删除掉1号点,再判定[0,2]是否满足,如果[0,2]满足了的话,那么就把2作为起点继续即可。代码如下:#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include < 阅读全文
posted @ 2012-09-13 21:31 沐阳 阅读(212) 评论(0) 推荐(0) 编辑
摘要:相当于表达式计算一般,用递归进行处理,将BEGIN视作是一个LOOP,每次进入LOOP则进行多条语句处理,知道遇到END位置,结束这个LOOP。代码如下:#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <string>#include <map>#include <queue>#include <v 阅读全文
posted @ 2012-09-13 19:45 沐阳 阅读(229) 评论(0) 推荐(0) 编辑
摘要:求一个数形如 A^B 的所有因子和对9901的模。我们首先得到A的素因子分解形式p1^e1*p2^e2...pn^en 它的B次方就是p1^E1*p2^E2...pn^En,其中Ei = ei*B。其素因子的和就是(p1^0+p1^2+p1^3+...+p1^E1)*(p2^0+p2^2+p2^3+...+p2^E2)*... 对于其中的一项进行二分计算即可。注意大质数的存在。代码如下:#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#include 阅读全文
posted @ 2012-09-13 12:15 沐阳 阅读(256) 评论(1) 推荐(0) 编辑
摘要:给定一个串,两个串有A,T,G,C组成,求其两两配对,可以各自插入如干个空格,求最后的和值得最大值。可以定义如下状态,f[i][j]表示1串到第i位,2串到达第j位通过各自补充空格达到一一配对的最终最大值,这就意味着f[3][0]也是有意义的,表示1串的前三个与三个空格的最终结果。刚开始做的时候就是认为长的一个串一定不要添加空格导致后面否定了一些状态。那么有状态转移方程f[i][j] = max{ f[i-1][j]+val[s1[i]]['-'], f[i][j-1]+val['-'][s2[j]], f[i-1][j-1]+val[s1[i]][s2[j]] 阅读全文
posted @ 2012-09-13 10:29 沐阳 阅读(189) 评论(0) 推荐(0) 编辑
摘要:题意是给定一个大数,这个数是由两个素数相乘得到的,现在问你这个大数的分解是否存在一个素数小于给定的数。由于这个给定的数L小于10^6,所以我们就可以打表到10^6,最好打的大一点(比10^6大的最小的素数即可),这样可以方便跳出循环。接下来,对于每一个数,我们直接对其小于L的所有素数进行一次试除,看是否余数为零。这里用到了一个大数取模的运算,一个大数对一个int型的数。过程是这样的,我们可以把一个数(abc...xyz)看作是10*(abc...xy)+z --> 10*(10*(abc...x)+y)+z,一直这样下去,我们在从最里面取模开始即可。代码如下:#include <c 阅读全文
posted @ 2012-09-12 20:22 沐阳 阅读(378) 评论(0) 推荐(0) 编辑
摘要:注意输出结果也是在32位无符号内就可以了。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;typedef long long Int64;Int64 C(Int64 a, Int64 b) { Int64 ret = 1; for (int i = 0; i < a; ++i) { ret *= (b-i); ret /= (i+1); } return ret;}int main() { .. 阅读全文
posted @ 2012-09-12 07:40 沐阳 阅读(186) 评论(0) 推荐(0) 编辑
摘要:给定两个数,这两个数的长度都不超过6位数,然后求后一个数被怎样的分割能使得其和值最接近前一个数,其实这个问题就相当于在后一个数中进行插板而已。通过状态压缩来枚举隔板即可。代码如下:#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <string>#include <map>#include <queue># 阅读全文
posted @ 2012-09-12 07:13 沐阳 阅读(242) 评论(0) 推荐(0) 编辑
摘要:LightningLessonsTime Limit:5000ms,Special Time Limit:12500ms,Memory Limit:32768KBTotal submit users:8,Accepted users:8Problem 12545 :No special judgementProblem descriptionZeus wrung his hands nervously. “I’ve come to you because I agreed to duel Thor in the upcoming Godfest. You’re good in a fight, 阅读全文
posted @ 2012-09-11 20:18 沐阳 阅读(607) 评论(0) 推荐(0) 编辑
摘要:给定一个数N,判定(1-N)中的数P满足gcd(N, P) != 1 && N % P != 0,当一个数在(1-N)中有奇数个这样的数,那么我们就是这个数是可取的,现在要求统计某一个区间[a,b]内有多少个满足要求的数。一般的思路就是通过区间相减来做了,对于1-N中有多少个这样的可以通过找规律来解决,不管你找没找到,我是没找到...这题可以来想,对于一个数N,其不互质的数的个数就是 N - phi(N),在剩余的数里面有多少个数是N的因子呢,通过素因子分解我们知道答案是T = (e1+1)*(e2+1)*...其中e1,e2是素因子的指数,所以最后结果就是 N-phi(N)- 阅读全文
posted @ 2012-09-11 11:47 沐阳 阅读(809) 评论(0) 推荐(1) 编辑
摘要:给定一系列树形关系用来描述整个公司的人员关系,现在问给定的这些关系是否存在矛盾的地方。比赛的时候写搓了,对于每一个点都去考虑的左右区间,其实这样做是不太好的,因为每次从员工推到boss,其实boss的工资是灵活变动的,也就是说只要boss工资的右区间减去所有孩子的左区间后还要至少留下单位1的工资来满足boss,所以只要计算一个区间关系即可,或者说,右区间是与孩子的右区间没有关系的。代码如下:#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#includ 阅读全文
posted @ 2012-09-10 22:01 沐阳 阅读(332) 评论(0) 推荐(0) 编辑
摘要:该题题意为给定一个序列,这个序列能够按照栈的规则进行进出,只不过每个位置的数具有一个数值,每次用出来的顺序减1乘以这个数值,求最后的综合最小。我们有这样的设想,对于一个序列 A B C ... Z,他们有相对应的数值 value[A], value[B] ... value[Z],现在对整个串进行分析,我们试图分析能否找到该问题的子问题,设f[i][j] 为 i 到 j 这个序列能够出来的最小值,那么对于第i号元素来说,我们有如下选择,先出去若干个元素再让a出去,对于某一个区间,我们又可以细分下去。为什么要选择 i 号元素来考虑,因为我们考虑 i 号元素时,选择其他的元素段来考虑都将是一个连续 阅读全文
posted @ 2012-09-10 20:43 沐阳 阅读(365) 评论(0) 推荐(0) 编辑
摘要:这一题是给定一个N,求一个最小的数M满足M^2%10^k = N,也就是M的平方的后面与N相同位数的数字的值为N。对于这一题,我的思路就是BFS搜索,对于每一位,假设出一个数来使得其平方的结果逐步的逼近最终的结果。代码如下:#include <iostream>#include <cstdlib>#include <cstdio>#include <queue>#include <algorithm>using namespace std;// 假设N是一个5位数,那么最差情况时是由1个大于等于5位数的数的平方得到的// 否则的话,就 阅读全文
posted @ 2012-09-10 14:26 沐阳 阅读(318) 评论(0) 推荐(0) 编辑
摘要:哈夫曼树,一个很耳熟的数据结构课上的内容。是用来处理编码的,准确的说是能够去压缩编码,本身是一种无损的压缩凡是,就是对于给定的字符做一个统计,然后根据统计构建一个长短不一的映射表,再根据这个映射表来恢复出原来的内容。这题是有一个长度为固定值得篱笆L,现在要N块木板来维护好这个篱笆,只要用锯子锯N-1次,题目就是给定N个长度,问如何安排使得最终的花费最短。花费是这样算的,要去锯那一段,那么花费就是这一段的长度。所以就有当某一段没有被分离出来时,那么它将连续作用于切割这一段的效果。因此我们希望起到这个连续作用的值越小越好,因此就可以用哈夫曼树来优化了。使用优先队列来写是非常方便的。代码如下:#in 阅读全文
posted @ 2012-09-06 17:09 沐阳 阅读(445) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示