信息学复赛用linux,信息学复赛考试技巧及注意事项

176319185_2_20191124052945297176319185_3_20191124052945360 竞赛中应该注意

176319185_4_20191124052945454一、会做的题目就一定要全过

二、不会做的题目蒙也要蒙几个点

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

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

五、学会编写极限数据

六、学会考虑出题者的思路

七、细节地方要注意好

八、最重要的:审题

基础要扎实,基本的算法要熟练掌握,不能眼高手低

176319185_5_20191124052945516

176319185_6_20191124052945641

176319185_7_20191124052945798

176319185_8_20191124052945922

176319185_9_2019112405294694176319185_10_20191124052946297注意事项

PART 1:写完代码之前

1.保持好的心态

考试前不要过于紧张,可以回忆一下以前考试常用的技巧,易错点和“骗分方法等”

2.审题:

这一点非常重要,一旦审题错误或者理解错误就可能造成你花很多时间写出来的程序WA,如果检查出来了,你浪费的是时间,如果没有发现,你丢掉的是分数和前途

解决方法:写代码前先把题读懂,读透,然后想出算法后才开始写

3.考虑严谨:

这一点也相当重要,如果考虑不严谨就可能被特殊数据卡分[0,100],例如:

NOIP2005过河

176319185_11_20191124052946610

176319185_12_20191124052946938

这道题很多人都会采用状态压缩,把间隔大于100的石头压缩为距离等于100,然后动态规划,却只能得80分。

这样就丢掉了20分,为什么呢?

176319185_13_20191124052947188

当S==T时不能压缩,应该特别判断,这就是丢分原因

解决方法:先要审题,然后要考虑特殊情况和极端情况

4.代码正确:

也就是说,你写代码时要争取一次写对。如果你写的代码有bug,那就需要查错,而查错需要的时间在(0,+inf),考试的时候查错花大量时间是不划算的。

解决方法:写一行,看一行,每写完一行,就考虑一下是否可能写错(for循环边界,格式控制符,i,j混淆......),还要加强静态查错

PART 2:写完代码之后

5.freopen:

文件输入输出是非常重要的一部分,一旦写错一点,就会丢掉[0,100]的分数,且无法挽回

解决方法:(图片摘自:NOI2018笔试题库)

176319185_14_20191124052947376

例:NOIP2017DAY2 T1 奶酪(cheese)

你的文件名:cheese.cpp

你的freopen:

freopen('cheese.in','r',stdin);

freopen('cheese.out','w',stdout);

注意千万不要写成chese等其他与要求不一致的单词

6.检查:

非常重要,但不多说,参考PART 1 中的2,3,4

还有注意检查你的程序是否在考试指定文件夹里面,而且不能存在指定文件夹的子文件夹里面

7.防爆(防止爆数组)

NOIP中爆数组是一件很糟糕的事,爆数组就0分

解决方法:数组定义要小于空间限制

用:printf('%.3f M\n',(double)sizeof(arr)/(1<<20)); 查看数组占用空间大小(单位:M)

176319185_15_20191124052947751

PART 3 其他

8.头文件

解决方法:不知道CCF开放万能头文件的使用没有,所以建议头文件不要用#include

因此头文件一定要写全,缺少必要头文件就是0分,同时不要用禁止使用的头文件(如:windows.h)

9.数据类型

一定要看题目数据范围,要考虑极端情况int是否足够。有句话说得好:十年竞赛一场空,没写long long见祖宗!不够时要考虑(unsigned) long long甚至高精度

还要防止中间结果溢出!!!

10.增加程序的鲁棒性

鲁棒性是什么呢?(鲁棒是Robust的音译,也就是健壮和强壮的意思)你可以把它理解为程序面对某些极端情况甚至数据不符

合数据范围下仍然可以不RE,得出正确答案

例:NOIP2002T2

176319185_16_20191124052947954

176319185_17_20191124052948157

176319185_18_20191124052948485

这道题题目描述说:所有字符串长度的上限为 20

如果你使用搜索,但是中间数组设的str[21]或其他过小的数组,那你就会丢掉[20,40]的分数,根据题目数据范围数组要设为str[210]或以上才安全

176319185_19_20191124052948641

解决方法:在你时间做完题后时间充裕的情况下可以考虑增加程序鲁棒性

11.注意隐性错误(非常重要)

一定要注意以下错误:a.缺少某些重要头文件 b.下标越界 c.中间结果溢出 d.该用long long却用了int

e.待补充

下面说明:

a.比如没有写#include,某些dev c++编译器遇到这种情况不会报错,而如果你使用了scanf,printf,CCF测评你就是0分。我想应该是真的吧,我们的教练曾经就讲述过这样的悲剧。

b.这个错误非常恼火,因为在自己电脑上运行,不严重的下标越界不会引起程序RE,而在很多OJ上,下标越界就RE,这样的错误确实难以发现

c.如果会发生这样的情况请计算时使用强制类型转换

d.比如:选择客栈,如果不分析用了int就会丢分

注意:以下讨论主要是基于windows考试环境176319185_10_20191124052946297考试技巧

1.时间复杂度的选择

根据每道题数据范围选择适当时间复杂度的算法

如:n<=5000,000 就应该选择O(n)及以下的算法,O(nlogn)的算法可能会超时

如果n<=10^9(如NOIP2017DAY1T1) 那就需要O(logn)或O(1)的算法了(推结论)

2.利用Dev C++

如果你的考试环境使用Dev C++那么注意以下:

a.在工具->编译选项 中将代码警告选项调为显示最多警告信息,帮助你尽可能多的发现隐性错误

176319185_20_20191124052950626

其他见:信息竞赛:DEV C++常用技巧

3.对拍(选学)

如果想学习这个,请先理解下一块:4.巧用cmd(选学,详情见下面)

所谓对拍,就是写两份程序,一份是用于考试提交的,还有一份用于检查用于提交的代码是否正确

用于提交的那份代码当然要求尽可能多的得分,检查用代码要求答案尽可能完全正确(可以写暴力枚举程序),显然检查用程序很可能超时,因此,我们用它来进行检查,而不是提交。(再次重申:注意文件名和输入输出,还有不要交错了代码!)

对拍是DAOLAO考试时常会考虑的方法(当然要时间足够)

写对拍程序步骤:

a.写数据生成器

就是可以随机生成满足题目条件数据的程序,面对不好写的数据生成器,不建议采用对拍方法(如限制要求苛刻的图,树等)

数据生成器的核心当然是随机数的写法

详细教程链接:NULL(还没有写好,大家可以在网上搜索)

b.写对拍器

我们常用的写法是写一个bat(批处理)程序,请熟记下面的代码:(当然不用记注释)

176319185_21_20191124052950813

其中的::是注释用的,相当于C++中的 //

c.写暴力程序

你需要熟悉各种暴力枚举方法:如:子集生成,排列生成,暴力搜索

然后暴力程序一定要写对

4.巧用cmd(选学)

a.启动目标在当前文件夹的cmd

先写一个bat程序:start cmd

没错,就一行,两个单词

但是这个bat文件千万不要保存名称为cmd.bat,否则它会不停启动自己,然后你考试就会受到影响(非常重要)

176319185_22_20191124052951329

看,划线的地方就是目标地址

b.使用cmd对比数据

标准数据太长的时候,肉眼观察肯定是一件恼火的事情,这里我们用fc(file compare?)

格式:fc ans1.txt ans2.txt

ans1.txt ans2.txt 代表两个不同的需要对比的文件,但是注意fc比较时不会忽略行末空格

注意ans1.txt ans2.txt必须在cmd的目标文件夹里面

176319185_23_20191124052951626

c.启动你的程序

格式:code.exe < in.txt  > out.txt

表示启动名叫code的exe程序并输入in.txt的内容,再将输出的内容保存到out.txt 中,这样你不需要用freopen

注意code.exe必须在cmd的目标文件夹里面

5.查错

之前讲了,写代码要尽量保证一次写对,但写错了有没有办法,需要查错

a.先检查算法是否正确,如果算法都不正确,不要慌,再想想,真的不正确那只有重写

b.如果不是算法问题,可以采取两种查错方式:静态查错,输出查错

所谓静态查错,就是讲代码用肉眼重新检查,观察可能错误的地方

所谓输出查错,就是一步一步输出中间结果(也可以用调试工具),按步骤排查错误

如果使用输出查错要注意提交之前将输出中间结果的语句删除或注释掉

6.“骗分”

当然不是靠作弊骗分,是靠“技巧”“骗分”

a.无解情况

例:NOIP2011DAY1T3

这道题很对于初学者很恼火,搜索+模拟不太好写,如果你是一个只要求NOIP150+的人,直接写一个输入数据然后输出-1的程序就可以了,这样可以得20分(注意:这种方法对于NOI一般不管用,NOI现在几乎所有题目每个测试点都有多组数据)

b.打表

对于数据小又容易超时的题,可以采取打表法

详细讲解:https://blog.csdn.net/Hi_KER/article/details/81188352

c.多次贪心

贪心不能解决的问题,可以尝试多次贪心

例如求最小值,你多想几个贪心算法,在贪心得到的答案中选最小的,可能会取得较好的效果

例如一道叫切割网线的搜索+剪枝+贪心题,我靠多次贪心水到了76分

d.推荐阅读:《骗分导论》,有数学竞赛版,信息竞赛版的,去网上搜索可以查到,有多个版本。虽然写作时间久远(2009及以前),但内容和骗分思想还是值得一看

---------------------

本文作者:Hi_KER

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值