华为|ACM 的正确入门方式是什么?

华为|ACM 的正确入门方式是什么?

文章图片

华为|ACM 的正确入门方式是什么?

想要入门ACM , 首先你要有一定的编程基础 , 一般国内的ACM选手都是用C++的 , 所以C++的基本语法你应该有所了解 。
1、库函数的了解
包括但不限于这些库(头文件):基本输入输出 如cstdio iostream , 以及一些从C的库弄过来的像cstring cctypecmath等库 , 具体可以随便百度一个人的代码 , 然后看看他的头文件

2、基础知识
如int的最大值是多少?int占多少内存?逻辑运算 , 循环等 , 不一一赘述 。 值得一提的是位运算 , 应当了解电脑中数据的存储方式 , 很多时候利用位运算帮助做题非常重要 , 如树状数组的lowbit , 状压DP , 快速幂等 , 每次我看到这些的时候都深深的感受到二进制的神奇 。
3、C++ STL:非常有用的STL 如algorithm vector list set stack queue map等 , 对于STL的学习 ,

4、Java基础
个人感觉Java并不常用 , 当然Java中的BigInteger类(高精度整数)是非常有用的 , 一般情况下 , 当别人苦逼的粘贴C++的大数类研究方法的时候 , Java可以十行代码优雅的解决问题 , 同时建议稍微学习一下BigDecimal类 。
语言使用C++ , 并尽量使用不符合工程代码规范的代码 , 只追求效率和队友能看懂即可 。 如果指针用的不熟 , 请尽量使用数组 , 避免莫名其妙的Segment Fault.请使用C++的\"普通\"语法以及STL , 什么C++的类的继承 , C++的模板类 , 命名空间的使用 , 一切能使得\"代码更加长更加好看更加看着舒服\"的做法都是在浪费宝贵的5小时上机时间 。
5、时间复杂度和空间复杂度的计算
时间复杂度是一个非常重要的概念 , 相同的问题 , 有的人给出的方法需要1s , 有的人给出的方法需要1h , 那必然是1s的方案在时间方面更优 。

空间复杂度同理 , 如果空间很大 , 用不完 , 可以考虑使用空间换取时间的方式 , 很多算法都是以这个为前提的 。
在icpc中一定要记住 , 思维能力和直觉是acm能力的核心驱动力 , 在思维能力达到一定层次以后 , 算法的学习能力也自然而然上来 。 而C++相对于C , 在输入输出流上的封装大大方便了我们的操作 , 同时降低了出错的可能性 , 并且能够很好地实现标准流与文件流的切换 , 方便了调试的工作 。
【华为|ACM 的正确入门方式是什么?】C++的另一个支持来源于标准模版库(STL) , 库中提供的对于基本数据结构的统一接口操作和基本算法的实现可以缩减我们编写代码的长度 , 这可以节省一些时间 。