CSP-J/S初赛复赛得分大法!(赠骗分导论电子书)

在OI竞赛圈儿里,你可能经常会看到一个业内黑话“骗分”,
但其实 “骗分=得分”,通过竞赛技巧来得分,并无贬义。

具体解释一下什么是骗分?

所谓骗分,是用简单的错误算法(比标准算法简单很多,选手能轻松搞定的程序),尽可能多得分数。
数据是赛前就出好的,出题人并不知道你可能会用什么错误的算法骗分。你的各种五花八门的算法,会让出题人很头疼。如果你能想出一个出题人很可能没想到的错误算法,那你的收获往往就非常大。

最后补充一句:不骗分,是骗分的最高境界。

骗分目的是什么?

信奥赛中尽量拿分,会做的不丢分,不会做的多骗分。

在OIer中,有一句话广为流传:任何犇犇必须经过大量的刷题练习才能成为大牛乃至于神牛。如果没有经过那么多历练,却要和大牛们同场竞技,我们该怎么以弱胜呢?答案就是:骗分。

做题技巧全解析

1 做题策略17条

仔细观察,迅速把握试卷全貌,认真审题

会做的题目就一定要全过

不会做的题目蒙也要蒙几个点,采用暴力策略

不要拘泥于你脑子出现的第一个算法

做完要仔细检查,检查,再检查

学会编写极限数据

学会考虑出题者的思路

细节地方要注意好

不要钻牛角尖,高效利用时间

无论发生什么,保持心态稳定

善于试题类化,准确提取知识

答题简明扼要,切忌画蛇添足

不仅求快,更要求准

能走就走一步,争取多得一分

只要不倒扣分,不妨尝试回答

重视复查环节,把好最后一关

充分利用时间,不必提前交卷


遇到难题不要慌,要沉着冷静,先使用数学分析手段 ,若不可行则采用骗分手段,能得几分算几分,哪怕使用朴素算法或错误的贪心算法,也不要让100分白白流走。

2 认知普及组的题目难度分配

第一题是相对简单的题,但是一般会有操作起来较麻烦,考虑情况很多,数据类型很大这样的特点来考你。

第二题是模拟,需要你抽象化问题,把问题的人工解决方法模拟出来,建立一个合适的数学模型,再用代码动手实验它。模拟的题一般比较麻烦,出错多很正常,甚至3个小时你不一定能解决一道模拟。

第三题是一个跳板,一般是考不难的DP、图论、搜索,需要有足够的算法知识和做题经验。

第四题相对比较难吧,会考一些像“单源最短路”、“SPFA”这样的比较“高级”的算法,所用到的数据结构也会比较“高级”,对于技巧、经验和心理都是一个考验。

对于各位新生来说,如果有难度,时间紧张,不妨放弃三、四两道题,第一题和第二题AC了也能有200分,第三和第四通过技巧尽量得一些分。


3 拿到试卷后怎么做

不要着急下手做题,先浏览所有试题,对题目的难易有个把握,哪些题目自己能做出来心里要有数。先做相对简单的题,做题之前先在纸上分析,优化可不可行都要试一下。先按照人类处理该问题的思维去构造一个数学模型,然后去掉不必要的模拟,找可行优化,选用合适的数据结构和算法去实现。

看看哪些题目可以简单的骗分(比如没有答案就输出-1这样的),先把骗分程序写一个拷贝到对应文件夹下,等到考试最后你忙着做题就没时间写骗分程序了。

4 八个常见低级错误

文件名打错/忘记用文件输入/忘记用文件输出/忘记关文件

数组开小

爆了内存限制

运算时爆int,忘记强制转换为long long

对答案取模的题目有地方忘记取模

输出时格式错误

输出64位整数时没有用%lld

提交时交错文件/打错扩展名

骗分技巧详解

1 题目的骗分技巧

手算、机算小范围答案

自己写极限数答案

交表

输出不可能情况

输出样例

2 详细的骗分技巧

交表的技巧

数组定义恰当

大规模数组要注意空间分配

当使用程序时要在可承受的时间复杂范围内

交表时数据的准确性

3 输出不可能情况和样例

05年普及第四题难度大,输出不可能情况(-1)有10分

04年普及组题输出样例,可拿一定得分

4 找数学规律

这道题的答案有规律么?

是不是只在某几个答案间呢?

只有0,1两个输出?

只有5个以下的输出?

总结骗分

比赛经验多,才会熟练使用这些技巧

多种方法一起用,效果更佳

当这道题很难的时候,优先选择编程复杂度低的算法

暴力枚举交表是两种常用的、简单的、效率特别高的骗分方法

1 暴力枚举

  • 最基本的暴力模拟也是一定要熟练的,毕竟很多时候正解是很难想出来的,这时如果你的暴力打的稳,并且优化的好的话,只要数据不是很大或者很坑,也是能拿到不少分的。
  • 直接输出第一个样例输出,测试点cout答案。
  • 尽量把数据都开long long或者double 编程尽可能把较小的数据通过。
  • 数据较大的一般需要用数据结构优化,此方法对oier要求比较高。

2 交表

交表其实挺简单的,就是把各个情况的答案列举出来,然后对应输出来。举个例子就能理解了。比如 求 n!(n < 100000 ). 把n = 1 ,2 ,。。。。时的阶乘结果用个数组存起来f[ 1...n] = ...。然后输入n时直接输出f[n].

上面这个例子就是打表。通常的用处都是在竞赛的时候对于某题在短时间内不能想出一个完美的算法,然后又能知道它可能出现的各种情况,所以我们就可以用手算或者暴力搜索把各种情况下的结果算出来,然后保存到数组里,最后对应读入的情况输出。

打表也算是骗分的一种,在竞赛时又时发挥着极重要的作用。毕竟竞赛以获奖为主。就是某些题目中输入数据总类型有限,可以利用另一个程序事先打好所有结果可能性,放在TXT里,主程序就可以直接调用AC了,比如08年提高组第二题火柴棒等式,因为输入在1到24之间,完全可以手工模拟出解,再比如求输入a,b间质数,a,b小于一亿,直接做必定超时,这时就可以先这个程序打质数表,主要程序就可以直接调用。

考前必看

自主复习一下旧的知识,比如字符串处理、快速排序这样的知识。

如果普及组第三题和第四题感觉找不到思路,则采用骗分策略;重点做往年真题第一题和第二题,吃透这两道题的知识点。

在赛前两周的准备时间中,不要再做难题,要做一些模拟题,并注意练熟基本算法,不要出低级错误。

你可能感兴趣的:(NOIP笔记,算法,青少年编程)