- admin 的博客
如何打比赛 (NOIP,省选,NOI,IOI或类似的)
- @ 2025-10-28 15:09:30
作者:刘承奥 (CommonAnts)
时间策略
1 先想所有题(40-70分钟)
1.1 逐字读完每个题,尤其注意数据范围以及每行开头结尾是否有容易忽略的信息。(可以思想验证小样例。)
1.2 每个题自由想10分钟左右。如果还没想出来,记录题目的研究对象、可能的寻找特例角度(特别是部分分)等认识。
1.3 再想想,直到时间足够或者没进展了。(具体内容参考下一节)最终,这一部分需要对每个题想出一个有效算法,(正解,或者暴力+性质)。
2 再写所有题(中间的时间)
2.1 写题顺序:先写好写(写题时间可控且有把握调试)的题(包括一些题的暴力分),再继续想没想完的题(卡住就停,改为写题),再写难写的题。
注意:代码长的题也有可能好写,极端例子是多合一提交答案。
2.2 在好写的题中,先写性价比高的做法,再写分低/代码长的做法
3 最后检查(5分钟)
计算代码的运行时间和空间:
#include <bits/stdc++.h>
using namespace std;
#define TIME 1e3 * clock() / CLOCKS_PER_SEC
bool Mst;
bool Med;
int main()
{
fprintf(stderr, "%.3lf MB\n", (&Mst - &Med) / 1048576.0);
XXXXXXXXXXX……
cerr << TIME << " ms\n";
return 0;
}
代码能力:程序测试和调试
设计——测试——调试
- 测试
- 大小样例
- 边界数据
- 枚举所有小数据
- 对拍
- 调试
- 找到尽可能小的错误
- 数据如果不存在,优先考虑越界、溢出等情况
- 逐段输出中间结果定位错误
- 找到错误位置之前不要盯着代码看!
- 用标准错误输出(cerr)打印调试信息
- 找到尽可能小的错误
总结
基本原则:先想所有的东西,再做(写、研究)所有的东西。不要把具体推导细节/写题的工作放在列出可能的灵感前面。定期(10分钟——或者喝口水/哼首歌/看看风景的时候)检查自己是否卡住,如果一段时间没有任何进展和方法(例如只能盯代码找bug或者没有任何思路的思考),立刻切换。(例如去写本题/其它题暴力)注意事项:最后检查程序假设是失败之母——永远不要假设第一题比第三题简单或者我不会的题别人会