有关卡常的Oj经验:
1,常用的C++输入输出中,cin/cout(包括getline(cin,str)…)>scanf/printf>getchar()/putchar();使用这种方法,在数据量较大时(百万次运算以上),能有较大的优化,cin、cout比scanf和printf慢了几百ms甚至上千ms,原因在于cin和cout要时刻和stdin和stdout同步,即和printf,scanf同步,因此
有一定的开销,此时,可以调用ios::sync_with_stdio(false);来取消二者的同步,此时可能会导致出错,但cin和cout的效率就升高了。getchar和putchar效率比较高的原因是一次仅仅对一个字符进行处理。而printf和scanf中的“%d”等字符串的匹配和识别也有一定的开销,会导致其速度比较慢。因此,如果希望有高效的输入输出,就使用getchar和putchar。
2.常用的一些类和模板也有一定的缺点,譬如,在使用string时,它的内存会占用更多,同时,如果要调用length等函数,也会有很大的开销。因此,能使用char就不使用string,能使用数组,就不使用vector。同时,在对函数传参时,可以传入一个char的元素,但是在函数中的形参以string形式出现,这样,仅仅在该函数中,char*保留有string的特性。
3,在使用new时,消耗的时间是使用创建数组的100倍,因此,在需要创建链表等的时候,可以先创建一个数组,每次需要new时就直接从数组里面取地址。
4. 对于动态规划,如果后一行可以由前一行和该行得出,那么可以使用只有两行的数组,来储存动态规划的结果。
5. 对于链表,有时也可以使用数组对其进行模拟,但是,是用这种方式的速度可能没有原来那么快,因为指针更底层,通过指针引用来获取数据更快。
oj的一些技巧。
最新推荐文章于 2023-06-04 12:53:36 发布