注意事项
1.在使用如map和queue这种STL容器时,容器中的元素类型不可以是引用类型(比如二维数组),否则会出现编译错误。
最好是使用vector,array,string等容器,来存储引用类型的元素。
2.如string、vector这些容器,都遵循以下规则:
此处以vector为例:
对于 std::vector,你可以使用索引操作符 [] 来访问和修改已经存在的元素,但是不能用来添加新的元素或者扩展 std::vector 的大小。如果你试图访问超出 std::vector 大小的索引,你将会得到一个未定义的行为。
如果你想在 std::vector 的末尾添加新的元素,你应该使用 push_back 方法。例如:
std::vector<int> v;
v.push_back(1); // v 现在包含一个元素:1
如果你想在 std::vector 的特定位置插入新的元素,你应该使用 insert 方法。例如:
std::vector<int> v = {1, 2, 3};
v.insert(v.begin() + 1, 4); // v 现在包含四个元素:1, 4, 2, 3
如果你知道 std::vector 的最终大小,你可以在创建 std::vector 时就指定其大小,然后使用索引操作符来修改元素:
std::vector<int> v(3); // v 的大小是 3,所有元素都初始化为 0
v[0] = 1;
v[1] = 2;
v[2] = 3; // v 现在包含三个元素:1, 2, 3
3.在使用STL容器时,如果需要对容器中的元素进行排序、查找、去重等操作,可以使用C++标准库中的算法库algorithm,其中包含了很多常用的算法函数,如sort、find、unique等。
4.注意不要把简单的问题复杂化,只要代码不超时,不爆内存,能通过就行,比赛的时候不要去追求所谓取巧的方法,思路明确还好,万一想了半天没想出来,岂不是本末倒置,顾此失彼,最后一分也得不到
比如蓝桥1508:N皇后
其中的遍历棋盘左上角的对角线和右上角的对角线,完全可以用两个for去分别判断,不要老想着用数学方法去解决,这样反而会浪费时间,而且容易出错
5.C++中,cin在遇到空格、换行符、制表符时会停止读取,而getline则会读取整行,包括空格、换行符等。
比如cin >> str
和getline(cin, str)
,前者只会读取空格前的内容,后者会读取整行内容
关于算法题中的坐标轴
在解决算法题时,一般我们习惯直接把二维数组的第一个索引作为x轴,第二个索引作为y轴
这样,x轴的方向就是向下,y轴的方向就是向右,如下所示:
int a[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
对于上面的二维数组,我们一般认为a[0][0]是左上角的元素,a[2][2]是右下角的元素,x轴的正方向是向下,y轴的正方向是向右
但实际上,其实坐标系如何定义对解题影响不大,只要保证从始至终用的是同一个坐标系即可,不需要太过注意
解题技巧
1.巧用word和excel解决填空题
对于一些填空题,可以使用word和excel来解决
比如蓝桥592:门牌制作
当然可以用代码暴力解决,但是发现其中的数学规律后,其实就是输出1~2020中有多少个2
这时候用代码去求比较麻烦,还得逐位取数
不如在控制台输出1~2020,然后复制到word中,然后用查找功能,查找2,统计个数即可
类似题目还有很多,都可以用word或者excel的某些特性或函数来快速解决,详见链接1和链接2