一、 解题步骤
这里我只是随便讲一点,大家在今后学习的过程中可以根据自己的情况做一些调整。1.审题
这一步工作主要是:
1)读懂题目的意思
不要小看这一步。现在的题目文字不少,有的有用,有的没有用,但是必须仔细看。
看似无用的信息可能正是有用的。
看完后至少要知道:
题目的描述的是怎样一个问题?
何出此问?即:我们需要解决的问题的困难之处在哪里?
我们的任务是什么?这个任务是什么类型的?(如:判定,求可行解,求最优解...)
数据的规模如何?
2)验证样例数据
这步工作绝对是必不可少。
验证的方法有两种:
a.直接验证
可能有的数据是直观可以验证的
b.程序验证
针对它设计一小段数据验证(注意:不是求解,只是验证其可行性)
在第一种做法时,还可以寻求求解方法,即手工计算,寻找一个可以得出该解的初步算法,
注意:这个算法在大多数情况下是不会采用的的。
2.建立数学模型
呵呵,就是简洁的重述问题啦。这是一个困难的工作,请看我后面的文章,这里不
多讲。注意:简单的题目可能会很快的找到或是类比得出一个已有的模型,而难题
往往是需要发挥创造性才能建立一个比较合适的模型。
3.设计数据结构和算法
呵呵,大的课题啊,以后再慢慢讲。
4.写出编码提纲和编码
一般应该写一点简要的编码计划,才能做到有条不紊,不会程序越写越难受,
5.调试和测试
我之所以不把它们截然分开,是因为测试出错后离不开调试,而调试完成的标准
就是通过测试。以后我会慢慢讨论这一部分的。
6.如果不是竞赛,应该写出解题报告,多做总结。我专门总结的笔记本就有N个:)
二、比赛技巧
1.题目难度的估计
这一步很重要,也比较困难。这里的估计有:思考出算法的困难程度,编程/调试复杂度,解是否容易验证等。
模拟题就很容易被错误的估计,所以建议放在后面编!
2.命题意图的估计
这一步有点鬼,因为常常不大好估计。但是准确的估计常常会给我们一个很好的思考方向。例如一般的
动态规划题目大都可以一眼就看出。
3.时间分配
这是建立在1,2的基础上的,我一般先做编程复杂度小的,例如动态规划和数学题
4.考虑特例
一般认为是没有办法的时候才使用,不过始终考虑特例是一个值得推广的好习惯:)