按照重要性递减
注意事项
*适用于四川
- 考试时要在 D 盘 csp 目录下作答,不能建立子文件夹。
- 代码中记得加
freopen
,考试结束前记得删注释。
- 检查“地球”的路径和准考证号是否正确。
- 注意数据范围选择合适的变量类型,若无法判断变量类型则一律开
long long
。
- 防止乱开
long long
出现的 MLE,TLE等问题。
- 若一个测试点中有多个测试数据,记得清空上个测试数据使用过的变量。
- 代码中的
n
、m
以及i
、j
不要写反。
- 时刻检查数组的大小,手动计算会不会 MLE,如果手算(计算器)算出的结果离限制很接近,建议开小一点。
- 数组不要在函数里定义。
- 及时删去不必要的数组防止爆炸。
- 不要拿英文单词做变量名,可以是缩写。
- 如果用
cin
要关同步。
- 关同步后的
cin
不要和 printf
一起使用。
- 递归注意栈溢出
- 若题目中要求取模,在程序中应该步步取模,不要使用
A += B; A % mod
类似的修改方法,应该使用A = (A + B) % mod;
- 注意判断边界问题,防止内存溢出。
- 不要乱使用以
_
开头的函数,或者是比较生僻的函数。
- 善用对拍。
- 考试中若要在Windows环境中使用
C++14
需要在dev
中的编译选项中
加上-std=c++14
- 注意精度问题,尽量避免除法运算。
- 写部分分操作完必须退出程序。
- 不要在代码里写小故事
- 考完试后请"友善"的对待每一个敲键盘特响的人,别被他们影响心态。
- 请好好的利用你周围的人,有可能他们很厉害.
NOIP
- 认真看题,避免题目看错导致心态爆炸,先读完全部四道题,再开始写代码,难度不一定递增。
- 争取 AC 第一题。
- 后面的题最好是先写部分分再打正解。
- 若一道题超过了一个半小时建议跳过,先去打部分分。死磕一道题的性价比一点都不好。
- 谨记 NOIP 的部分分是相当多的,如果你发现自己打不出来部分分请考虑简化自己的思路。
- 考试开始的时候应该多拿少的分。
- 不要太功利。
技巧
测样例
考试的时候样例很多,我们可以把所有的样例都复制到 csp 文件夹内,然后检查程序的时候直接修改文件操作名。
举个例子一道题目是AKIOI
,他的输入是AKIOI.in
,假如良心 CCF 给了 10 个样例,就可以将以下内容:
freopen("AKIOI.in", "r", stdin);
修改为
freopen("AKIOI1.in", "r", stdin);
freopen("AKIOI2.in", "r", stdin);
freopen("AKIOI3.in", "r", stdin);
......
freopen("AKIOI10.in", "r", stdin);
可见非常的方便,你就不用每运行一次就打开一个文本文档复制一下再打开另一个文本文档了。直接修改freopen()_
内中的内容即可。
对拍
考试的时候可能会想出来一些奇妙的点子,但是想验证正确性怎么办呢?这时候对拍就发挥用处了。
完成对拍我们需要 4 个 cpp 文件他们的用处分别是:
- 需要验证的程序
- 保证绝对正确的程序
- 数据生成器
- 校对器
接着我会通过一个例子来详细阐述每个 cpp
的用处
题目描述:输入两个整数,其取值范围为[0, 1e18],求他们的和。
我现在写了一份我不知道正不正确的程序。
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
cout << a + b << endl;
return 0;
}
我有点不太放心于是我决定验证一下。先将代码另存为一下,并修改一下:
// Wrong.cpp
#include <bits/stdc++.h>
using namespace std;
namespace V {
void Main() {
//在这个里面放入你需要验证的程序,我拿a + b problem 举例子
int a, b;
cin >> a >> b;
cout << a + b << "\n" ;
}
}
int main() {
freopen("test.in", "r", stdin);
freopen("Wrong.out", "w", stdout);
V::Main();
return 0;
}
这样子他就能从test.in
中读入,在Wrong.out
中输出。
接着写一份你认为完全正确的代码。并对他添加输入输出重定向。
//Answer.cpp
#include <bits/stdc++.h>
using namespace std;
#define int long long //应当一律使用long long 防止一系列问题的产生
namespace STD {
void Main() {
/*这里应该放你认为正确的代码*/
int a, b;
cin >> a >> b;
cout << a + b << "\n" ;
}
}
signed main() {
freopen("test.in", "r", stdin);
freopen("std.out", "w", stdout);
STD::Main();
return 0;
}
接着开始生成数据
//data.cpp
#include <bits/stdc++.h>
using namespace std;
#define int long long ////应当一律使用long long 防止一系列问题的产生
int rnd(int x, int y) {
return ((rand() * rand() * rand()) % y + x) % y; //可用于生成指定范围内的随机数
}
void Start() {
cout << rnd(1, 1e18) << " " << rnd(1, 1e18) << "\n";
}
signed main() {
freopen("test.in", "w", stdout); //将数据生成到`test.in`中
srand(time(0)); //随机数种子
Start();
}
最重要的地方来了,校对器。校对器主要利用了 Windows cmd 中的 fc 命令,可以比较两个文件。
//check.cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
while (true)
{
//system 可以调用 Windows 相关的指令
system("data.exe"); //先运行数据生成器
system("Answer.exe"); //运行保证正确的代码
system("Wrong.exe"); //运行待验证的代码
if (system("fc std.out Wrong.out")) { //开始比较
system("pause"); //如果有差异则暂停等待操作,pause 就是"按下任意键继续"。
}
}
return 0;
}
完成了 4 个 cpp 的编写之后先把他们全部都编译一遍,一定要编译!!!
然后运行check.cpp。然后就可以去看其他的题目了,时不时的看一眼有没有问题。
可以看到一开始输出的是
Comparing files std.out and WRONG.OUT
FC: no differences encountered
这个代表的没有问题,若你运行了接近 10 分钟你的程序依然没有停止,那么就大概率说明你想出来的做法是可行的。
若显示
Comparing files std.out and WRONG.OUT
***** std.out
2874271586
***** WRONG.OUT
-1420695710
*****
Press any key to continue . . .
这就说明你的代码确确实实存在问题,需要调整,具体的问题已经被指出,可查看 test.in
、Wrong.out
、std.out
的内容,根据输出来判断代码中哪里出现了问题。
通过分析,我们发现输出负数是没开 long long 造成的,发现问题之后修改代码就不是一件很难的事情了。
对拍还适用于日常code中的debug,可以复制一篇题解来帮助自己调试
结语
希望以上内容能够帮助到你。
若你觉得有什么内容你没有懂,或者是不够详细,有遗漏等你可以直接在页面下方评论或发邮件联系我
祝大家:
$${\Huge \mathbf{{\color{Red}CSP2024RP+=+\infty } } } $$
$${\Huge \mathbf{{\color{Red}NOIP2024RP+=+\infty } } } $$