要注意输入量大不大,若输入量大则有必要使用在使用cin,cout的情况下加入代码ios::sync_with_stdio(false),或者不要使用cin, cout,直接使用scanf, printf。
不要忘了考虑用unordered_map,unordered_set,如果你需要非常多的查询的时候,比如区块链那题,当建立结点与产生的块和接收的链之间的映射时,并不需要对结点编号进行排序,所以用map很耗时,相反,用hash实现的unordered_map会节省很多时间。比如游戏那题,当要存储每个位置有哪些时间点被访问过时,用unordered_set<int> vis[][],比set<int> vis[][]要更好。
当写cmp函数时,千万记得当比较相等时返回false。
当你使用set,map时,不要一个一个遍历找元素然后删,这种很慢,你要使用erase函数。
注意题目中对浮点数的输出要求,比如小中大那题,它说如果中位数是小数,则保留一位小数,否则,就输出整数,所以中位数可能是int型,也可能是double型。
注意什么时候要用long long,比如小明放学那题,计算绝对时间有可能超过int的表示范围,就要用long long了。
移位运算错误,注意num>>2这样的运算不会改变num的值,只会返回一个新的值。
不要犯小错误,类似于 if(i1>=p.size() && j1>=u.size()){ 写成 if(i1>=p.size() && i2>=u.size()){ 这样的小错误。
编程中经常会出现一些闭合式操作,不要有了头没了尾,比如压栈后有弹栈。
1 | int dfs(int player){ |
上面的代码,第11行和第18行组合成闭合操作,不要忘了写18行的代码。
在字符串处理中,可能会出现转义字符,但是输出时要求去掉转义字符,比如ee\"ee应该输出ee"ee。
函数参数中含有输出参数时,不要忘了向输出参数中赋值,比如:
1 | void dealString(string& s){ |
尽量使用简单数组,而不是vector,set之类的,比如压缩编码那题。
当要多次遍历一个图中的点的邻接点,比如对图进行n次bfs遍历,那么用邻接表会更好,若用临街矩阵则会超时,比如通信网络那题。
当字符串变量多的时候,注意别东冠西戴了,比如Markdown那题,把markdown[i]写成line[i]了。比如权限查询那题,user, auth, authName这三个变量把人弄晕了。
若说N的最大值是10000,则写MAXN=10005,被写成了MAXN=1005,这也是很难发现的问题。
数据处理顺序的问题,比如炉石传说那题,我把postAttack(实现随从位置的移动)的位置放错了。还比如,0/1背包问题,从背包容量为n开始递减更新,还是从背包容量为0开始递增更新,是不一样的,若不采用缓存,则后一个方案会导致错误。
路径解析那题,题意说的很不清楚,因为题目中给的p个路径全都是基于第一条路径的,而不是上一条路径,我记得以前也犯过这个错误,现在又犯了。
一定要注意输出的空格问题,有些题可能要求一行内的每个项目之间不用加空格,比如画图那题。
空间复杂度问题,当数组开到1e8规模时,若用元素为int,则占用400M空间,很有可能运行错误,若元素为bool,则不会。