noip2011

 

一、应考要求

1.今年复赛有哪些变化

从今年起分为两试,每试三个小时三道题,星期六上午第一试,星期天上午第二试。我猜想是与NOI比赛一致起来,因此试题形式也会与NOI比赛一致,只不过是降低难度而已,可能今年的NOIP复试试题难度与十年前NOI比赛试题相当。因为今年是第一次实行这种形式,估计第一天的一试是一些基本题,大部分同学都能做的。第二试考查你的能力,好的同学要靠它来拉开与一般同学的差距。

耐力要有,信心要有。做好一试,二试也不要怕它,如果是都没有见过的新题,大家都在同一起跑线上。

 

2.要会读故事

复赛试题不会象数学题那样,直接将已知条件告诉你,再告诉你要求什么。往往编一些看起来是生活中的故事,有时这些故事一点意思都没有。我们关心的不是故事中说的什么事,这些事是不是真有,我们要能从故事中提取出有用的信息,知道真正要让我们处理什么样的数据,要得到什么结果。

 

3.认真审题,先规划后动手

故事读完知道了要做什么,下面就是该怎么做了。

数据如何存储,要定义什么样的变量,开多大的数组,内存空间上会不会超标?如果超标能不能利用数据之间的关系将它们压缩,最好是能将数组降维。

程序用什么样的结构,主要的算法是什么,规划好后再动手写程序,这样才不至于越写越乱,越做问题越多,有些要解决的问题是绕不过去的。

 

4.拿分才是硬道理

平常写程序时,追求完美,老师不仅要你们的程序对,还要求“好看”,比赛时倒不看你的程序是如获如何写的,只要你的程序在限定的时间内得到所要的结果就行。有人在网上发过所谓“骗分技巧”,在“黑匣”评测的规则下,这些都是“合法”的。记得有人在做“2n个队循环赛安排”时,将n=1、2、3、4对应的2、4、8、16个队的比赛日程人工排好,对输入的n case一下就直接输出,而那道题的测试数据最多到32个队,80%的分数拿到了。

 

5.慎重选择,合理放弃

   一般的试题都要告诉你数据范围,如30%的数据在一个低的范围,60%以内的数据在什么样的范围,100%的数据是什么范围。假如你确实只能解决小数据的,只好放弃全对的期望,保你能肯定对的。因此每年复赛回来后,某些题总有这样的情况:分析出这道题真正要让你用的算法的同学花了半天的时间却因一个小错或者是一个小的忽略而“颗粒无收”,那些大胆放弃大部分的同学在这道题上却得到30分。

如NOIP2005普及组复赛最后那道所谓最难的“循环”,N位(N为100以内)的自然数与自己相乘,乘多少次后,后N位又与自身相同。

 

二、算法选择

正如世上没有包治百病的药一样,也没有一种算法能解决所有问题。计算机科学的发展积累了一些经典的算法,有些问题可以套用这些典型的算法,更多的问题却不是某一种算法就能解决的,有时是几种典型算法的结合,有时没有先成的算法可以套用,要靠考生现场去探索,哪怕只是解决其中的部分问题,这样也正好能拉开差距。

1.简单而实用的穷举法

理论上讲,列举出所有可能的情况总能得到结果,因此有人喊出“穷举万岁”,是说穷举法简单而又实用。也有人就是靠穷举一路走到复赛的省一等奖。

穷举不仅可以穷举路径,更可以穷举结果,选择好穷举对象是关键,控制好范围不要超时。数据量大时,穷举经常会遇到超时的情况,超时是穷举的致命硬伤。

 

2.模拟不能算是算法,它是程序员必备的能力

试题描述中是怎么做的,程序就模拟怎么做,该进时进,该退时退,须记录时就记录(变量赋值)。选择合适的数据结构如标记变量(或者数组)、栈、队列、树等,这样才能方便程序的实现,数据清晰,不该有的交叉绝对不能有,正如数学上函数的对应关系一样,f(x)对于某一个x有一个唯一确定的值与它对应。

前几年的NOIP复赛第一题基本上都可以通过模拟或者再结合其它的一些基本算法就可以完成。如NOIP2010第一道题.

某道题如果你不能确定套用什么典型算法来实现,那么你就模拟吧!

  

3.有了递归,写程序不累

连续的重复,用循环实现。有条件的自我调用,通过递归来实现,递归的好处是系统自动设置栈来存储调用时的状态(相关数据自动入栈),待调用结束返回时相关数据再出栈——从哪里出去的再回到哪里来。

许多时候,不能确定循环次数的穷举,或者是模拟不断自我重复调用,有了递归的方法,在Pascal语言系统里不管是function还是procedure都可以实现递归。

NOIP复赛时写程序,不用递归几乎是不可能的。

当然,本来应用动态规划的你用递归来实现,如果不能存储中间结果的话,太多的重复运算将会造成超时。

 

4.动态规划,师生的牵挂

这几年的NOIP复赛,每年几乎都要有一道动态规划的题,出题者不出一道这种类型的题感觉考得不全面一样。而学生做完四道题没有发现有哪道用动态规划的方法,心里便不踏实:“是不是我没有想到用呢?”出题的老师与考生都牵挂着它。从NOIP1999的“拦截导弹”到NOIP2004的“合唱队形”、NOIP2005的“过河”,再到NOIP2008的“传纸条”、NOIP2010的“乌龟棋”……动态规划终于从NOI稳步走到NOIP里来了。

典型的动态规划,无非是顺序选择的过程,最后要求的是最大或最小值,并不要求输出如何得到这个最大或最小值的。

 

5.二分法适用于单调区限内的不断逼近

分治的策略并不是非得用的,有一类问题明显适合用而已:虽然说对于任一个自变量都有唯一的值与之对应,有求值的方法,但是自变量为实数型(不可以一一枚举),且能确定在某个区间内是单调增或单调减,这样可以不断地取这个区间的中点求值,再根据这些值来调整区间,直到达到指定的精度。

 

6.排序要能“手到擒来”

提高组可能不会专门考你排序,排序只是作为解决整个问题的一个不可缺少的部分。要能根据问题中数据的特点选择合适的排序方法,省时间或省空间。

如NOIP2004的“合并果子”,开始合并果子前先要将所有堆果子由小到大排一次序,然后每合并一次果子都要重新排序,用普通的排序即使是快速排序,时间级别也是n2logn,题中n最大到30000,可能会超时。如果选择变化的归并排序,操作都是在队伍的两头进行,几乎是线性的,效率十分高。

 

7.能用递推来求的不必用递归

找出解决问题的递推公式是个难点,适用递推公式的问题一般是求路径条数,该问题从某一步到下一步总是只有有限的分步,如“小鼠迷宫问题”,小老鼠每一步最多有上下左右四个方向可以走,S步到达指定格子的路径条数等于到达这一格四面格子S-1步的路径条数之和。再如NOIP2002普及组最后一题的“过河卒”,你可以通过递归来模拟从起点走向终点的过程,每到一次终点就计数一次,当m*n稍大一点时就会超时,可以直接用的递推式是:c[I,j]=c[i-1,j]+c[I,j-1]。

递推式与动态规划转移方程的区别是后者往往是在若干个数据中选择一个最大的或最小的,自定义min或max函数是动态规划算法实现中不可获缺的。

 

8.归纳法与贪心法要慎用

考试时间有限,有很短的时间里你就能归纳出问题的通用方法或者说是得到了通用解,除非这类问题你之前见过并解决过的,否则大部分情况下是不正确的。就拿那个经典的平方和通项公式来说,用数学归纳法来证明倒是简单,当初是如何猜想出来的才是最难的,数学家波利亚设计出将12+22+32+……+n2和1+2+3+……+n结合起来的表格才方便看出规律。

贪心的策略要能证明其正确性,虽然不要求你写出证明过程,学过的一些贪心法可以直接使用,临时想出的贪心法,“不走平常路”有时也能撞对一两个点,那是不得已而为之。

 

9.宽搜与深搜各有千秋

宽度优先搜索好比按层遍历树结点,它的优点是最先找到的解可能就是最优解,缺点是数据结构要求高些,虽然先找到的解就是最优解,但要输出路径时有点麻烦。最常用的数据结构是队列,占有内存大。一般情况下只要通过循环实现即可。

深度优先算法如同先序遍历树的结点,递归实现起来比较简单,输出路径也比较方便。它的缺点是先找到的解不能确定是最优解,还要搜索完不超过指定深度的所有点后才能确定是最优解。深搜应用时适当的剪枝是必要的,如第一次找到的解深度为6,以后的搜索都在不超过深度为6的情况下进行。

 

10.关注一下交互类型

以前NOIP复赛测试时不会有交互类型的,但NOI有,从今年起的NOIP会不会有,可以关注一下,如果有的话,不会超过一题,试题中可能会提示你如何来完成交互,有关单元的定义一定会有提示的,不要被交互吓得不敢做了。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值