1.题目坑点
1.时间复杂度
2.空间复杂度
3.数据溢出(long long有时可以解决)
2.打表
代码前部用数组等数据结构暂存中间过程某值的一组答案,在代码后部直接从这组答案中查询,不需要再计算,节省时间。
3.滚动数组
用两个一维数组模拟二维数组中相邻的两行,向下滚动,节省空间复杂度。
4.素数
1.从1到sqrt(x)查看x是否为素数,算法时间复杂度为O(log(x))【可能有错误】。
2.区间内素数查找:素数筛/线性筛【学了已忘】。
5.快速幂
适用场景:求x的x次方的个位且x很大,比如1000000000^1000000000。
基本思路:用取余概念
最佳思路:套用快速幂模板
typedef long long ll;
//计算x^y的最后mod位
ll quickmod(ll x, ll y, ll mod) {
ll res = 1;
while(y) {
if(y & 1) res = res * x % mod;
x = x * x % mod;
y >>= 1;
}
return res;
}
什么意思呢???再说
6.关流
ios::sync_with_stdio(false);
//关闭cin/cout同步流,关闭后cin速度可媲美scanf
7. 万能头文件
#include <bits/stdc++.h>
8.排序
8.1 sort
自定义cmp()函数的返回值要是bool,核心之处也是比较,因为sort默认是从小到大,所以在cmp如果还是要从小到大,那就a < b,返回值bool为true,不改变;而如果想要从大到小排,那么就要return a > b,因为默认a小于b,所以此时返回的bool就是false,要改变排序。
9.桶排序
适用场景:数据量已知、每个数据的大小所在区间已知、数据有重复
时间复杂度:O(n)
空间复杂度:O(m)
#include <cstdio>
using namespace std;
const int maxn = 10010;
int n, t;
int vis[maxn];//桶
int main() {
scanf("%d", &n);
for(int i = 0; i < n; ++i) {
scanf("%d", &t);
vis[t]++;
}
bool flag = true;
for(int i = 0; i < maxn; ++i) {
if(vis[i] > 0) {
if(flag) {
print("%d", i);
flag = false;
}
else
print(" %d", i);
}
return 0;
}