华师一附中OI组

标题: 200410C班网课内容 [打印本页]

作者: admin    时间: 2020-4-9 21:41
标题: 200410C班网课内容
到此为此,循环,数组,函数大家基本都会了,可以说NOIP150-200分的能力是基本有了,去年一等奖是165,前年是185,这几年基本都在160-200之间,你们有能力拿得到,但是实际上能得到那么多的分数吗?现在大家最大的问题是做题慢,准确度不高,为什么呢?你做少了,没有大量的训练,没有形成条件反射,所以看到题目你反应不过来用什么方法,感觉不到这个方法可能的局限。我们到现在大约做了100个题目,但是你们都掌握了吗?我们现在总结下我那60题的,看看他们的解题重点,我们记住它,以后碰见类似的题目就用这种方法。

1-6题:基本的数据类型和函数,要学会给数据分配类型,什么时候用实数,什么时候用,整数还要注意什么时候用int 什么时候用long long,函数要记住常用的输入输出函数cin cou和常用数学函数(swap,floor,ceil,sqrt,abs,log2,log10,pow等)
7-13题:if语句的使用,条件判断,复合语句,if嵌套,
14-21:主要训练for循环,找数列的规律,规律有很多,可以找an和n的关系,也可以找an与an-1的关系等等,要学会灵活使用,注意很多题目可以多种方法,比如18题,每种方法都要掌握。
22-25:主要训练while循环,次数不确定的循环,当然也可以强行用for。要注意体会判断条件在执行,然后再判断条件,再执行的过程。还要注意数学表达和计算机语言表达之间的差异。砍掉最后一位、接在某数的后面等的C++表达,回文数里面那个保存现场的语句都很重要。
26-30:条件统计,一边枚举一边判断,典型题目:班上有多少个女生就是班上每个人判断是否女生求和,注意这里有两个条件,哪个条件管哪个操作心里要有数。次大的那种迭代更新要注意顺序。
31-33:多重循环,这个地方有学生就开始迷糊了,你只要想想时针分针的走动情况就应该可以理解了,这里第一要注意和前面一样的哪个语句是控制哪个条件的,不要搞错了。第二就是要尽量减少不必要的循环和判断。不是男生就一定是女生;公鸡母鸡数量确定了小鸡就是100-g-m。
34-35:很有点逻辑思维的题目 很多大学教材上的算法入门题目,不是简单的数列和统计,流程有点复杂,要结合我的那个PPT理解他的流程图,着重体会如何将程序写得规范,不提倡某些书上的for循环统计约数个数判断质数。
36-43:循环和判断的综合应用题,每几个题都代表了一类思维,有的判断整除,有的分离数字,多做这样的题,锻炼基本的编程思路。
44-48:数组的基本应用,数组可以说就是一组数,如何大规模操作它们呢,找到i和ai之间的关系很重要。
49-51:简单函数的使用,你们现在只要记住简单的送入1-2个参数x返回一个值y就基本差不多了。以后还要讲复杂的参数传递。
52-54:基本字符串的使用,学会使用getline size等,加深char和int等的认识。
55-59:高精度运算,基本的加减乘除,考察综合编程能力,现在程序已经达到了50行左右,要能写这么长而完全没错,是不容易的,除非大量的练习,没有人可以帮你。
60:进制转换,字符串,字符,数,相互转换。熟练的综合应用题。
几乎所有的考试的第一二题都可以在这些题目里面找到类似的解法,二月初我们由此独立作业,我事后专门讲了做法和原型题,大家好好去看看体会下。

这里我以P1426小鱼会有危险吗为例说明:题目请看http://hsyit.cn/forum.php?mod=viewthread&tid=36195
简单的说意思就是问当l>=s-x下一秒是否能l>s+x。这里我们假设等于的时候也会被探测到。

我们会做这个第18题 s=1+2+4+8+**1024吧,等比数列求和,小鱼的速度其实也是等比数列。
我讲的一种做法是
s=0;for (i=1;i<=1024;i=i*2)  s=s+i;另外一种是 s=0;a=1;while (a<=1024) {s=s+a;a=a*2;}
我的题目里面s=0是和的初值, i=1是单项的初值,i<=1024是最后一项的终止条件。i=i*2是因为后面一个是前面的2倍,s+=i是加进总和,换到此题,初值v=7,终止条件应该是总路程>=s-x,稍加修改:
为了避免误解,路程用l表示,不用s,s有了其他的意思。
l=0;for (v=1;l<s-x;i=i*0.98)  l=l+v; 换用while更好理解l=0;v=1;while(l<s-x){l=l+v;i=i*0.98;}
另外,因为是*0.98,所以l,v都是float。
这样就求得了到达探测器左边界时候的小鱼的速度,那么下一秒小鱼的位置应该是l+V。最后判断一下v+l>s+x就是题目所求,所以此题其实原型题是第18题。
18题你掌握的不好,这个题就不好下手,第18题你理解的好,这个题其实是一样的。

再看看P1152 欢乐的跳 http://hsyit.cn/forum.php?mod=viewthread&tid=69322
我们在三连击里面讲过,但是这次用一个和三连击有点不一样的方法:
设置数组b1-b9,初值都是0,这个差值i出现了相应的bi就变成1,最后判断b1-b9是否都是1,全1的话说明都出现了,一个简便的方法就是b1-b9全部加起来看总和是否等于9.
差值有可能不在1-(n-1)范围内,可能就越界了,所以加一句话:
if (x<=n) b[x]=1;
剩下的就简单了,所以这个题的原型题是三连击,三连击的那个判断重复是核心,方法也是多样的。三连击的判断是one+one=two的判断就有区别,和这个也有区别但是思想是一样的,就是数组下标i和值a(i)的对应处理。


作者: admin    时间: 2020-4-17 10:00
这60道题都是C++程序设计的基本知识,对初学者来说,认真理解和掌握其中的思想和技巧是有必要的,以后做后面的难题,都需要前面的基础技能。
作者: admin    时间: 2020-4-17 17:17
55-60题是各种高精度计算和进制转换,思路不复杂,数学题你都是这样算的,但是因为变量比较多,循环也比较多,很多同学就会混淆变量的名称,作用,变化情况等,所以这里我要求定义变量的时候要取有意义的名字,减少很多不必要的麻烦。在就是脑里要清晰的理解执行的步骤和变量的变化情况。多做是有必要的。




欢迎光临 华师一附中OI组 (http://hsyit.cn/) Powered by Discuz! X3.2