⑴ 这道题怎么做(请给出详细算法和程序,使用PASCAL语言)
……这个题思考复杂度还好吧……题目类型:贪心
我先从样例给你分析,然后告诉你算法流程,你先自己试试能不能用pascal实现,如果实在不行,你再留言,我帮你写程序。毕竟自己写出来的东西印象深。
分析:如果把样例按由小到大排序得:17,18,19,26,30,38,41。有这样一个事实:对于一个数,他当主场,只有在他前面的数可当他客场。他当客场,只有他后面的数可当主场。先分析他当主场的情况,因为数列严格递增,所以假设选第i个数当主场,那么最优的客场应该为i-1,因为如果不选i-1当客场,假设选i-2当客场,那么a[i]-a[i-1]>a[i]-a[i-2]所以选i-1当客场更优。
那么我们把排序后序列做差,得1,1,7,4,8,3,从差中选出最小的前k个求和即为所求。
算法流程:1、读入n个数,排序
2、对于n个数,从第二个数开始,每个数与前一个数做差得到n-1个数。
3、对n-1个数取前k个求和,和即为所求。
标程:若无法自己完成程序,请写信到[email protected]。
只有自己写出来过,印象才深。
⑵ 求一个算法(贪心算法)
首先,无所谓哪里密集哪里不密集的说法,这是人为的区分,需要首先遍历全部格子才能确定,是最慢的算法,全部遍历过了就可以得出最优的路线了.
既然用贪心算法,为了思考方便,可以假设棋盘无穷大,算法的目的是判断下一步该往右走还是往下走,思想如下:
判断当前格子右、下两个相邻的格子是否有金块,情形如下:
1)如果一个有一个没有,则往有金块的格子走
2)如果都没有或都有,则需要判断往哪个方向走能更快的拾到下一个金块,方法如下:
让机器人假设地各往两个方向走一步,然后对当前格子作判断情形如下:
A)一个格子继续走能拾到金块,另一个不能,则上一步往该格子走
B)如果仍旧都有或都没有,重复2)直到找到符合A)的情形。
假设棋盘是N*N个格子,则贪心算法最坏的情形是要遍历整个棋盘,比如只有第一个格子有金块时,就需要遍历整个棋盘才能确定走法。最好的情形也需要遍历4*N个格子。
时间复杂度上来算的话,应该是O(nLogn)
⑶ 如何写一个算法
算法是在有限步骤内求解某一问题所使用的一组定义明确的规则。通俗点说,就是计算机解题的过程。在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法。前者是推理实现的算法,后者是操作实现的算法。 一个算法应该具有以下五个重要的特征: 1、有穷性: 一个算法必须保证执行有限步之后结束; 2、确切性: 算法的每一步骤必须有确切的定义; 3、输入:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定除了初始条件; 4、输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的; 5、可行性: 算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。 当遇到一个算法问题时,首先要知道自己以前有没有处理过这种问题.如果见过,那么你一般会顺利地做出来;如果没见过,那么考虑以下问题: 当遇到一个算法问题时,首先要知道自己以前有没有处理过这种问题.如果见过,那么你一般会顺利地做出来;如果没见过,那么考虑以下问题: 1. 问题是否是建立在某种已知的熟悉的数据结构(例如,二*树)上?如果不是,则要自己设计数据结构。 2. 问题所要求编写的算法属于以下哪种类型?(建立数据结构,修改数据结构,遍历,查找,排序...)3. 分析问题所要求编写的算法的数学性质.是否具备递归特征?(对于递归程序设计,只要设计出合理的参数表以及递归结束的条件,则基本上大功告成.)4. 继续分析问题的数学本质.根据你以前的编程经验,设想一种可能是可行的解决办法,并证明这种解决办法的正确性.如果题目对算法有时空方面的要求,证明你的设想满足其要求.一般的,时间效率和空间效率难以兼得.有时必须通过建立辅助存储的方法来节省时间.5. 通过一段时间的分析,你对解决这个问题已经有了自己的一些思路.或者说,你已经可以用自然语言把你的算法简单描述出来.继续验证其正确性,努力发现其中的错误并找出解决办法.在必要的时候(发现了无法解决的矛盾),推翻自己的思路,从头开始构思.6. 确认你的思路可行以后,开始编写程序.在编写代码的过程中,尽可能把各种问题考虑得详细,周密.程序应该具有良好的结构,并且在关键的地方配有注释.7. 举一个例子,然后在纸上用笔执行你的程序,进一步验证其正确性.当遇到与你的设想不符的情况时,分析问题产生的原因是编程方面的问题还是算法思想本身有问题. 8. 如果程序通过了上述正确性验证,那么在将其进一步优化或简化。 9. 撰写思路分析,注释. ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------看不懂,还是不明白,有谁清楚告诉我啊,
⑷ 怎样快速判断一个编程题用什麽样的算法
这个要靠积累,见的题多了,自然能很快地选择合适的算法。
还要有比较丰富的知识,比如你想求一元二次方程的根,你要知道根的计算公式。想求是不是闰年,你要了解闰年的判断规则。
其实最主要的是经验,要多练,看一些经典类型的题目,如排序,循环,数组,可以挑一些感兴趣的题目练习一下。