摘要: 城市平乱描述 南将军统领着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 笑巧 阅读(604) 评论(0) 推荐(1) 编辑
摘要: 题意:有两种不同的通信技术,有卫星通信的两个城市之间可以任意联络,但用无线电通信的城市只能和距离不超过D的城市联系。无线电的能力越高(即传输距离D越大),花费就越大。已知无线电的数目m,让求最小的D。刚看完题目时,很迷茫,不知道该往哪去想,直到老师提醒我们用最小生成树解时,我才恍然大悟。这道题设计的真得很巧妙,如果不细心看题,及对最小生成树不熟练时,根本不知道从何下手。看来我练得还不到家,仍需继续努力。 思路:先求出每两个顶点之间的距离,(注意:是double类型的),然后用普里姆算法(Prim)求最小生成树。由于无线电的数目已给出m,需要把最小生成树分成m份,即删除m-1条边,得到m个连通. 阅读全文
posted @ 2011-08-24 19:58 笑巧 阅读(3128) 评论(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 笑巧 阅读(5847) 评论(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 笑巧 阅读(4581) 评论(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 笑巧 阅读(1541) 评论(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 笑巧 阅读(466) 评论(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 笑巧 阅读(970) 评论(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 笑巧 阅读(4410) 评论(1) 推荐(1) 编辑
摘要: 题意是N个人过河,船每次只能坐两个人,船载每个人过河的所需时间不同,问最快的过河时间。解题思路:当n=1,2,3时所需要的最小时间很容易求得,现在由n>=4,假设n个人单独过河所需要的时间存储在数组t中,将数组t按升序排序,那么 这时将单独过河所需要时间最多的两个旅行者送到对岸去,有两种方式: 1> 最快的(即所用时间t[0])和次快的过河,然后最快的将船划回来,再次慢的和最慢的过河,然后次快的将船划回来. 即所需时间为:t[0]+2*t[1]+t[n-1] 2> 最快的和最慢的过河,然后最快的将船划回来,再最快的和次慢的过河,然后最快的将船划回来. 即所需时间为:2*t[0 阅读全文
posted @ 2011-07-22 11:30 笑巧 阅读(3160) 评论(0) 推荐(1) 编辑
摘要: 【问题描述】利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼码的编/译码系统。 【基本要求】一个完整的系统应具有以下功能:(1)I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。(2)E:编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文件hfmTree中读入), 阅读全文
posted @ 2011-06-29 17:06 笑巧 阅读(4785) 评论(0) 推荐(1) 编辑