OJ代码技巧:
- map在计数的时候很好用:
(1)因为是键值对,所以不会有重复的键,重复输入的话会更新值。(即map.size()就是键的种类数)
(2)按照键的大小,会自动排序,所以不用sort函数
(3)->first: 键 ->second: 相同的键的个数
(4)it: map<int,int>:: iterator it=map.begin() (遍历用)
- node也是一个数据类型,坐标时可以方便使用
- ceil,floor是math里的函数,即向上向下取整
- 养成良好的编程习惯:虽然OJ没必要,但是最好写成输入然后接口调用专门函数。
- 用字符串处理大数问题常配合int计算,只要-‘0’即可
- stl:list的用法就是链表。构造函数同vector,有push_back(),pop_front(),front,back,begin(),end(),merge()等,注意不能使用下标访问。循环用iterator。用这个要比自己写链表快多了,而且不容易出错!!!
- 断点调试:意义就在于——找到出错的代码
- !!!坚信——对于程序,只要你不懒,总能查出来,写出来,调试出来。问题就在于时间。而这个是是随着你的见多识广,调试的经验而减小的。
- algorithm自带sort,对vector—参数一:.begin()参数二: .begin()+.size() 参数三:comp—bool comp(int i,int j){ return (i<j) }
- 将string转为int: atoi(string.c_str())——即先转为字符串,然后由字符串转为int
- 2^31即为int型的大小
OJ算法技巧:
- dp套路:数组+循环
- dp的坑:如果数组多了一行一列,在结合input实现表达式的时候一定要注意,下标不要出错。
- dp的坑:dp循环上三角的题,第一层递增的量,第二层是起始点,那么第二层循环的约束条件要注意。
- dp0-1背包的题面套路:给出一组元素,看是否能组成特定要求的,或者看能组成的数量。
- 回文序列:注意处理单个和两个的特殊情况。
- 模板:假如每个主题有大约5个模板,有十个主题就有50个模板。模板本身就已经够多的了,如果只是死记硬背不知变通,那。。。而且OJ本身就是一个要求全面的东西,谁也不能要求自己一蹴而就。首先应该实现主要功能,如果有过不去的样例,再仔细思考加一些语句试试。
- 数学:乘法运算过程——两层循环(从最低位),low:新乘积加原来的,末位low%,倒数第二位:原本+low/10
- 归并:两个都while循环,单个就循环后直接接上。
OJ AC技巧:
-
WA:输出没问题,特别样例暂时想不出。那么,一定要从问题本身出发,也许你想到的办法只能解决样例。(非常重要!!!)
-
WA:处理特殊样例的时候,有没有同步输出?有些输出需要变量加加减减挺复杂的,所以特殊样例的时候是不是忘了处理。
-
RunTimeError:数组越界的一种情况。输入是字符串,但是没考虑特殊样例“”,访问不到自然越界了。
-
TimeLimitExceeded: 某些样例没过。在求Tribonacci的时候时间超限了。解决:如果递归上限小的话,递归可以转为数组。