摘要: 题目:数组中有 n 个数据,要将它们顺序循环向后移 k 位,即前面的元素向后移k位,后面的元素则循环向前移k位,例:0,1,2,3,4 循环移3位后为2,3,4,0,1。 解题思路:这道题解题方法有很多,后移让我想到了队列,因为是先进先出,n 个数据后移 k 位就可以当成前 n-k 个数据依次出队后又依次入队,从队头出进入队尾。然后再依次输出队列中的元素即为最终移后各元素的位置。因此可以运用队列来解这道题。注意:当k>n时,应先进行取摸运算k=k%n,也是一个简化过程。代码如下:View Code 1#include<iostream>2#include<queue>3 阅读全文
posted @ 2011-10-18 14:01 笑巧 阅读(477) 评论(0) 推荐(0) 编辑
摘要: 题目:求 n次二项式各项的系数,已知二项式的展开式为: 解题思路: 如果直接用上面的公式去计算,计算量很大,当 n 比较大时,算法因时间效率太低。有一个数学常识:各阶多项式的系数,成杨辉三角形的规律,具体如下所示: ( a+b )0 1 ( a+b )11 1 ( a+b )2 1 2 1 ( a+b )3 1 33 1 ( a+b )4 1 4 6 4 1 ( a+b )5 …… 以这个知识为基础,求 n 次二项式的系数的数学模型就是求 n+1 阶杨辉三角形,l算法设计:¡第i层有i-2个数据需要计算(a[1]=a[i]=1)¡1个一维数据存放已经算出的一行数据¡ 阅读全文
posted @ 2011-10-18 13:45 笑巧 阅读(1601) 评论(0) 推荐(0) 编辑
摘要: 解题思路:题意让求买下所有种类的珍珠的最小花费,注意题中明确说明为了防止旅游者仅买一颗珍珠,必须额外的买10颗该种类的珍珠。为了减小开销,可以买比该种类质量高的珍珠代替,从题中的例子可以看出。求解本题要用到动态规划,用dp[i] 表示买前 i 类珍珠所需要的最小花费,则递推关系式为:dp[i]=min( p[i]*( a[i]-a[j]+10 ) + dp[j], k ),其中a[i] 表示前 i 种类珍珠的总个数,而 k 初始化为无穷大。代码如下:View Code 1#include<iostream>2#include<cstring>3usingnamespac 阅读全文
posted @ 2011-10-15 19:40 笑巧 阅读(425) 评论(0) 推荐(0) 编辑
摘要: 编写算法:根据参数n打印具有下面规律的图形,如,当n=4时,图形如下: 1 52 863 10974 问题分析:容易发现图形中数据排列的规律。 方法一: 先用一个数组按此顺序存储数据,再正常输出;用斜行、列描述新的循环方向。 斜行i取值(1~n) 列j取值(1~n+1-i)关键问题:第i斜行、j列的数据对应于第几行第几列的元素斜[1,1]—a[1,1] 斜[2,1]—a[2,1] 斜[3,1]—a[3,1] 斜[4,1]—a[4,1]斜[1,2]—a[2,2] 斜[2,2]—a[3,2] 斜[3,2]—a[4,2]斜[1,3]—a[3,3] 斜[2,3]—a[4,3] 斜[1,4... 阅读全文
posted @ 2011-10-08 19:07 笑巧 阅读(354) 评论(0) 推荐(0) 编辑
摘要: 题意很明确,把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?解题思路:所有不同的摆放方法可以分为两类:至少有一个盘子空着和所有盘子都不空。分别计算这两类摆放方法的数目,然后把它们加起来。设f(m,n)为 m 个苹果,n 个盘子的方法数目,如果 n>m,必定有 n-m 个盘子永远空着,去掉它们对摆放苹果方法数目不产生影响;即 if ( n>m ) ,f ( m ,n )=f( m , m)。当 n<=m 时,不同的放法可以分成两类:即有至少一个盘子空着或者所有盘子都有苹果,前一种情况相当于 f ( m , n )=f ( m , n-1 ); 阅读全文
posted @ 2011-09-01 17:29 笑巧 阅读(972) 评论(0) 推荐(0) 编辑
摘要: 题意明确,让计算出起始有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 笑巧 阅读(274) 评论(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 笑巧 阅读(519) 评论(0) 推荐(0) 编辑
摘要: 题意很明确,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。 看到这道题,很熟悉,貌似以前做过,可就是想不起来解法,还是以前做的不认真。很惭愧,不过这次的解更优化。 解题思路:老实说,我从来没想到要用动态规划做。或许对动态规划了解不深吧,练得少。如果要是明确求两个字符串的最长公共子序列,我知道要用动态规划,这个老师也讲了多遍。万万没想到这道题就是变形后求原串与其逆串的最长公共子序列,然后用串长减去最长公共子序列的长度就是要添加的最少的字符数。(如果有人提醒我,我就知道怎么办了,可是在比赛的时候全靠自己。)另外还需注意的是字符串长度最长Max为5000. 阅读全文
posted @ 2011-08-27 19:33 笑巧 阅读(5281) 评论(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 笑巧 阅读(1491) 评论(0) 推荐(1) 编辑
摘要: 对于一个连通图,输出最多能删除多少条边,使这个图仍连通。Input: N M //N—顶点数,M—边数 v1 v2 …… //M 行Output: 删除的边个数及各边(这是几天前老师给我们讲了最小生成树后出的一道题,留给大家思考并求解。) 解题思路:连通图是个不带权的无向图,而有向图是强连通图(若非老师提醒,大家都迷糊了)。其中删除的边数很容易求出,不需要后面的M行边的输入,直接就可以求出是M-(N-1),要使这个图仍连通所需要的最少的边是顶点数减1,即最小生成树。关键就是怎样求这些要删除的边,我知道还是要用到最小生成树的算法,老师的一句话提醒了我们,可以把这个图的每条边权值都赋为1,然后再. 阅读全文
posted @ 2011-08-26 21:24 笑巧 阅读(293) 评论(0) 推荐(0) 编辑