【第十三届蓝桥杯备战】C/C++解题时的一些个人小技巧和注意事项(持续更新中)
先说一些废话:我最近觉得写算法题就像是打格斗游戏一样,格斗主要分为
确认和
确认后的连续进攻两个过程。
确认考验的是选手迅速切入问题的能力,也就是基本确定了使用什么算法来解决问题;而
确认后的连续进攻即将自己练习的连招准确无误地打出来,这个考验的是选手的熟练度。对于算法高手而言,他们的算法积累无疑都是非常深的,手速也很快,因此对他们而言,谁的
确认问题的速度更快,谁就在比赛中更有优势。但对于笔者这种菜鸟来说,即便碰巧偷了问题的“下盘”,也往往会在使用连招过程中失误,从而导致
断连,最终被问题一击KO。为什么会
断连?简单来说,是因为练习不够,但可以进一步细分为两部分:一个是算法熟练度低,另一个是没有形成一个快速稳健的编码习惯,比如总是在输入输出上卡壳,调试时总是反复手敲数据等等,当然这主要还是对语言掌握不深以及经验不足所致。
本篇不着重于具体问题的算法流程,主要分享个人认为的算法之外的一些注意点以及编码技巧。确保在已知解题算法的前提下能用“一套连招快速带走”题目,而不至于惨死在算法之外的方方面面。这样也可以让我们把更多精力放在算法设计方面,避免浪费大量时间。
输入输出
- 考虑到效率问题,标准输入输出尽量用
scanf() 和printf() ,且尽量不要将std::cin 和scanf() 以及std::cout 和printf() 混着用(有时会出现问题,比如下面的情况,用于加速std::cin和std::cout,此时绝对不能把C和C++的输出混着用,具体实例见[1])。
std::ios::sync_with_stdio(false);
std::cin.tie(0);
-
long long类型的输入输出:scanf("%I64d", &n); 。注意是字母I(i),不是l(L),且一定是大写。 -
输出带前导零的整数,比如时间格式HH::MM::SS ,打印语句应为printf("%02d:%02d:%02d\n", h, m, s); ,其他情况依此类推。
调试
- 可以用
freopen 函数进行输入输出流的重定向,把数据放在文件里,笔者这里给个简易调试模板,默认情况下在执行代码的当前文件夹下新建一个名称为in1.txt 的文件,用于存放用例输入,注意数据文件第一行为用例的数目;提交代码时只需要把#define DEBUGMODE 注释掉即可。#include<iostream>
#include<cstdio>
using namespace std;
#define DEBUGMODE
int main(){
int tCase = 1;
#ifdef DEBUGMODE
freopen("in1.txt", "r", stdin);
scanf("%d", &tCase);
#endif
while (tCase--){
}
#ifdef DEBUGMODE
cin.get();
cin.get();
#endif
return 0;
}
如果本文有描述不妥的地方,或是有更好的方案,欢迎交流与指正!
References
[1] LT-Y. sync_with_stdio(false)的副作用[EB/OL]. https://www.cnblogs.com/Little-Turtle–QJY/p/13832888.html, 2020-10-17.
|