08 2011 档案

摘要:题意明确,让计算出起始有m个金片的汉诺塔金片全部移动到另外一个针上时需要移动的最少步数是多少?(由于结果太大,现在只要求算出结果的十进制位最后六位)解题思路:大家都很熟悉汉诺塔求移动次数公式为f(n+1)=f(n)*2+1; 由于0<m<1000000000,按要求,只需要输出结果的十进制最后六位,即f(n+1)=(f(n)*2+1)%1000000(注意是1后面是6个0,刚开始我就弄错了)。由于m 取值范围太大,如果按公式计算一定会超时。经过测试多组数据发现,当m>100005时,有如下规律:f(123456)=f(23456); f(123456789)=f(234567 阅读全文
posted @ 2011-08-29 21:37 笑巧 阅读(314) 评论(0) 推荐(2)
摘要:本题不难理解,画图后很容易看出。即求各城市每条给定起点和终点间通路的最小负载,并据此求出所有最小负载中的最大值。解题思路:本题是迪杰斯特拉(Dijkstra)的变形,但不是单源点的最短路径,而是按路径中最大权值作为搜索方向。注意:将城市名字转化为数组标号。代码如下:View Code 1#include<iostream>2#include<cstdio>3#include<cstring>4usingnamespacestd;5#defineMax2056#definemax(a,b)((a)>(b)?(a):(b))7#definemin(a,b) 阅读全文
posted @ 2011-08-28 20:26 笑巧 阅读(559) 评论(0) 推荐(0)
摘要:题意很明确,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。 看到这道题,很熟悉,貌似以前做过,可就是想不起来解法,还是以前做的不认真。很惭愧,不过这次的解更优化。 解题思路:老实说,我从来没想到要用动态规划做。或许对动态规划了解不深吧,练得少。如果要是明确求两个字符串的最长公共子序列,我知道要用动态规划,这个老师也讲了多遍。万万没想到这道题就是变形后求原串与其逆串的最长公共子序列,然后用串长减去最长公共子序列的长度就是要添加的最少的字符数。(如果有人提醒我,我就知道怎么办了,可是在比赛的时候全靠自己。)另外还需注意的是字符串长度最长Max为5000. 阅读全文
posted @ 2011-08-27 19:33 笑巧 阅读(5447) 评论(4) 推荐(1)
摘要:刚看完题后,没有想到要用欧几里德算法求解,觉得只是道简单的数论。后来发现问题了,就开始找原因。解题思路:这道题和POJ1061(青蛙约会)一样,都是同余方程的求解,用到了拓展欧几里德算法。而本题题意明确,就是求解这个公式:(a+c*x)mod2^k=b ,求得x 的最小解。变形后可得:c*xmod2^k=b-a,即 c*x=(b-a)mod2^k; 这就是标准的同余方程。注意:k <=32 ,而 2的 32次方超出整数范围,所以要用__int64或long long ,就不会出现runtime error了。其实数论真得很神奇,一变形就是我们所熟悉的知识。看来还是我见得少,练得少,下次一 阅读全文
posted @ 2011-08-27 16:44 笑巧 阅读(1531) 评论(0) 推荐(1)
摘要:对于一个连通图,输出最多能删除多少条边,使这个图仍连通。Input: N M //N—顶点数,M—边数 v1 v2 …… //M 行Output: 删除的边个数及各边(这是几天前老师给我们讲了最小生成树后出的一道题,留给大家思考并求解。) 解题思路:连通图是个不带权的无向图,而有向图是强连通图(若非老师提醒,大家都迷糊了)。其中删除的边数很容易求出,不需要后面的M行边的输入,直接就可以求出是M-(N-1),要使这个图仍连通所需要的最少的边是顶点数减1,即最小生成树。关键就是怎样求这些要删除的边,我知道还是要用到最小生成树的算法,老师的一句话提醒了我们,可以把这个图的每条边权值都赋为1,然后再. 阅读全文
posted @ 2011-08-26 21:24 笑巧 阅读(328) 评论(0) 推荐(0)
摘要:城市平乱描述 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市。他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M。现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱。现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间。注意,两个城市之间可能不只一条路。输入 第一行输入一个整数T,表示测试数据的组数。(T<20)每组测试数据的第一行是四个整数N,M,P,Q(1<=N<=100,N<=M<=1000,M- 阅读全文
posted @ 2011-08-25 15:16 笑巧 阅读(623) 评论(0) 推荐(1)
摘要:题意:有两种不同的通信技术,有卫星通信的两个城市之间可以任意联络,但用无线电通信的城市只能和距离不超过D的城市联系。无线电的能力越高(即传输距离D越大),花费就越大。已知无线电的数目m,让求最小的D。刚看完题目时,很迷茫,不知道该往哪去想,直到老师提醒我们用最小生成树解时,我才恍然大悟。这道题设计的真得很巧妙,如果不细心看题,及对最小生成树不熟练时,根本不知道从何下手。看来我练得还不到家,仍需继续努力。 思路:先求出每两个顶点之间的距离,(注意:是double类型的),然后用普里姆算法(Prim)求最小生成树。由于无线电的数目已给出m,需要把最小生成树分成m份,即删除m-1条边,得到m个连通. 阅读全文
posted @ 2011-08-24 19:58 笑巧 阅读(3138) 评论(0) 推荐(0)
摘要:当看完这道题时,觉得似曾相识。这道题跟不久前老师给我们出的那道题很像,一看就是解同余方程。其中还有欧几里得算法的应用。 思路:两只青蛙跳一次所花费的时间相同,我们设其为t,则x+mt是青蛙A从坐标原点到终点所走的距离,y+nt是B走的距离,要想碰面,则他们相减一定是地面周长的整数倍,设为k*L;则:(x+mt)-(y+nt)=kl;变形得:(m-n)t-(y-x)=kL;即有(m-n)t mod L=y-x;为线性同余方程。此方程有解当且仅当y-x能被m-n和L的最大公约数(记为gcd(m-n,L)),即gcd(m-n,L)|y-x。这时,如果x0是方程的一个解,即当t=x0时,(m-n)t. 阅读全文
posted @ 2011-08-23 16:47 笑巧 阅读(5922) 评论(3) 推荐(1)
摘要:题意很明确,但要注意只能横着走或竖着走,不能斜着走,而且要求找出从左上角到右下角的最短路线。 思路:迷宫是一个5 × 5的二维数组,搜索起来不会很复杂,也不会超时。从左上角(0, 0)位置开始,上下左右进行搜索,可以定义两个数组,即 dx[4]={1,-1,0,0};//表示x方向的变化;dy[4]={0,0,-1,1};//表示y方向的变化。二者结合就是一个点可以上下左右移动。对于数组中的每个元素用结构体来存储,除了有x,y成员外,还要定义pre成员,用来表示从左上角到右下角的最短路径中每个元素的前一个元素的下标,即保存路径,方便后面的输出。通过广度搜索借助队列进行操作,当中要注意 阅读全文
posted @ 2011-08-22 20:22 笑巧 阅读(4601) 评论(0) 推荐(0)
摘要:说到偏序集,在离散里的定义是: 设R为非空集合A上的关系,如果R是自反的、反对称的和传递的,则称R为A上的偏序关系,简称偏序,记作≤。偏序是在集合X上的二元关系≤(这只是个抽象符号,不是“小于或等于”),它满足自反性、反对称性和传递性。即,对于X中的任意元素a,b和c,有:自反性:a≤a;反对称性:如果a≤b且b≤a,则有a=b;传递性:如果a≤b且b≤c,则a≤c 。 带有偏序关系的集合称为偏序集。令(X,≤)是一个偏序集,对于集合中的两个元素a、b,如果有a≤b或者b≤a,则称a和b是可比的,否则a和b不可比。在X中,对于元素a,如果任意元素b,由b≤a得出b=a,则称a为极小元。一个反链 阅读全文
posted @ 2011-08-21 13:16 笑巧 阅读(1597) 评论(0) 推荐(0)
摘要:1. gcd ( a , b ) = gcd ( b , a % b ) 辗转相除法求最大公约数: int gcd ( int a , int b ) //a,b不同时为0 { if ( b== 0 ) return a; else return gcd ( b , a % b ); }利用最大公约数求最小公倍数: int lcm ( int a , int b ){ if ( a * b ==0 ) return 0; else return a * b / gcd ( a , b ); } 求 ab mod n: int modExp ( int a , int b , int n){ i 阅读全文
posted @ 2011-08-18 16:35 笑巧 阅读(495) 评论(0) 推荐(0)
摘要:划分一:对于一个正整数n的分划就是把n写成一系列正整数之和的表达式。例如,对于正整数n=6,它可以分划为: 6 5+1 4+2, 4+1+1 3+3, 3+2+1, 3+1+1+1 2+2+2, 2+2+1+1, 2+1+1+1+1 1+1+1+1+1+1 根据例子发现“包括第一行以后的数据不超过6,包括第二行的数据不超过5,……,第六行的数据不超过1”。 因此,定义一个函数Q(n,m),表示整数n的“任何被加数都不超过m”的分划的数目,n的所有分划的数目P(n) =Q(n,n)。 模型建立: 一般地Q(n.m)有以下递归关系: 1)Q(n,n)=1+Q(n,n-1) (m=n) Q(... 阅读全文
posted @ 2011-08-17 11:19 笑巧 阅读(1009) 评论(0) 推荐(0)
摘要:该题题意明确,就是给定一组字母的大小关系判断他们是否能组成唯一的拓扑序列。是典型的拓扑排序,但输出格式上确有三种形式: 1.该字母序列有序,并依次输出;2.该序列不能判断是否有序; 3.该序列字母次序之间有矛盾,即有环存在。而这三种形式的判断是有顺序的:先判断是否有环(3),再判断是否有序(1),最后才能判断是否能得出结果(2)。注意:对于(2)必须遍历完整个图,而(1)和(3)一旦得出结果,对后面的输入就不用做处理了。代码如下:#include<stdio.h>#include<string.h>intmap[27][27],indegree[27],q[27];in 阅读全文
posted @ 2011-08-16 13:09 笑巧 阅读(4430) 评论(1) 推荐(1)