LOADING...

加载过慢请开启缓存(浏览器默认开启)

loading

PTA技巧

2022/3/25 竞赛/算法

时间优化:(写好的代码有测试点运行超时, 可以暂时放下, 不要浪费时间)

  1. 如果出现运行超时考虑是否因为非法输入导致死循环

  2. 尽量创建全局变量(创建一次,后面赋值),不要重复创建临时变量

  3. 尽量使用scanf,printf,而不使用cin,cout (C++的IO存在缓存(可取消))

#include <bits/stdc++.h> //万能头
using namespace std;
→→→    ios::sync_with_stdio(false); ←←←
→→→    cin.tie(0);cout.tie(0);    ←←←
  1. 使用引用访问容器中的元素(遍历,排序==>增强型for循环)
vector<int> vc{0,1,2,3};
for(int& i : vc)
    cout << i;
  1. 使用unordered_map,unordered_set替换map,set可以提升效率(注意改头文件)

  2. 为了实现排序功能,尽量使用sort对数组排序,而不要依赖与map和set的自动排序(map,set结构庞大)

  3. 一般递归算法都比较慢,深搜(DFS)可以通过剪枝优化,并查集可以进行路径压缩提升效率。


时间优化:

  1. 为了方便函数调用,可以都用全局变量(但这是个坏习惯)

  2. 不确定数据多少的情况,不一定非要用动态数组,可以直接根据题目给的数据范围定义一个较大的数组(大小应大于题目所给的范围),一般情况下不会出现内存超限 [数组大小别超过10^8,二维数组不能超过array(10000)(10000)]

  3. 答案错误很有可能是漏了题目的关键信息

  4. 格式错误是因为排版跟题目要求不同,可能多空格或空行

  5. 段错误是因为非法访问才会导致,一般情况下是因为数组访问越界

  6. 涉及到除法的要考虑除数不能为0,一般会有一个测试点

  7. 图论问题用深搜可以得到大部分的分

  8. 选取适当的结构(容器)可以让思路更清晰

  9. 熟悉编译器的调试功能(Debug)可以更快找出bug


必备知识:

​ 数据结构与算法:

  1. 树:二叉树的遍历方式,平衡二叉树的建树过程,根据两种遍历来建树

  2. 图:深搜,广(层)搜,并查集(推荐博客)

  3. 堆:堆结构,建堆过程(堆排序)。

  4. 链表:根据结点连接链表(一般通过结构体进行模拟)。

  5. 排序:熟悉快排和归并排序的排序过程

常用库、函数(黑科技)

容器、字符串处理、lambda表达式、自定义排序、类型转换、数值边界、数学函数、auto关键字、堆、常用功能函数(查找 计数 倒序)
知识点 说明 推荐博客
string容器 封装了一些对字符串的常用操作 C++ String详解
regex正则表达式 使用正则表达式来替换、查找字符串 C++ 正则表达式
stirngstream字符串IO类 使用字符串来进行IO操作 C++ stringstream
常用字符处理函数 isdigit(char ch)
  1. sort函数排序,自定义结构体比较方式

  2. STL标准库list,vector,queue,stack,map,set

  3. 数组(容器)倒序

    1. 倒序函数: void reverse(typename begin, typename end);
    2. 利用反向迭代器倒序(构造new string)
  4. auto关键字

  5. find函数

string str; // string类函数:未找到返回string::npos
if(str.find("substr") != string::npos);
    //......
set<int> st;
if(st.find(0) != st.end()); //set、map成员函数: 未找到返回尾迭代器
    //......
vector<int> vc;
if(find(vc.begin(),vc.end(),0) != vc.end()); //序列式容器可以通过algorithm库中的find
    //......