基础知识
头文件
- #include <bits/stdc++.h> //几乎包含所有头文件
输入输出
- fgets (buf, MAX, stdin):获取一行字符串,可以获取空格
二分
- 头文件algorithm
lower_bound(address_start,address_end,value): 返回的是value出现的第一个位置。
lower_bound(address_start,address_end,value): 返回的是大于value的值出现的第一个位置。
binary_search(address_start,address_end,value):返回的是是否存在这么一个数,是一个bool值。
排序
- 头文件algorithm
sort(address_start,address_end,cmp):sort默认是升序排序,bool型变量cmp可以改变排序方式
数学问题
最大公约数与最小公倍数
int gcd(int a,int b){
if(b==0) return a;
else return gcd(b,a%b);
}
分数的表示与运算
struct Fraction{
long long up,down;
};
Fraction reduction(Fraction result){
if(result.down<0){
result.down=-result.down;
result.up=-result.up;
}
if(result.up == 0){
result.down=1;
}else{
int d=gcd(abs(result.down),abs(result.up));
result.down /= d;
result.up /= d;
}
return result;
}
- 分数的四则运算
按照分数的四则运算公式,计算出分子与分母,最后化简 - 分数的输出
void showResult(Fraction r){
r=reduction(r);
if(r.down == 1) printf("%lld",r.up);
else if(abs(r.up)>r.down){
printf("%d %d/%d",r.up/r.down,abs(r.up)%r.down,r.down);
}else{
printf("%d/%d",r.up,r.down);
}
}
素数
bool IsPrime(int n){
if(n<=1) return false;
for(int i=2;i<=(int)sqrt(n*1.0);i++){
if(n%i == 0) return false;
}
return true;
}
const int maxn = 1000
int prime[maxn],pNum = 0;
bool p[maxn] = {false};
void Find_Prime(){
for(int i=1;i<maxn;i++){
if(IsPrime(i)==true){
prime[pNum++]=i;
p[i]=true;
}
}
}
struct factor{
int value;
int count;
}
Find_Prime();
int num;
for(int i=0;i<pNum && prime[i]<=(int)sqrt(n*1.0);i++){
if(n%prime[i] == 0){
fac[num].value=prime[i];
fac[num].count=0;
}
while(n%prime[i] == 0){
fac[num].count++;
n /= prime[i];
}
if(n != 1){
fac[num].value=n;
fac[num++].count=1;
}
}
大整数运算
const int maxn=1000;
struct bign{
int d[maxn];
int len;
bign(){
memset(d,0,sizeof(d));
len=0;
}
};
树
二叉树
二叉树的存储
struct Node{
typename data;
Node* lchild;
Node* rchild;
};
图论
图的存储
- 邻接矩阵:用二维数组表示
G[N][N]
- 邻接表:
只存储每条边的终点编号:vector<int> Adj[N]
,添加从 i 到 j 边时,只需要Adj[i].push_back(j)
语句即可
要存放其他信息时,用结构体:
struct Node{
int v;
int w;
Node(int _v,int _w) : v(_v),w(_w) {}
ElemType info;
};
vector<Node> Adj[N];
Adj[i].push_back(Node(3,4));
图的遍历
- DFS:将经过的结点设置为已访问,下次递归碰到该结点时就跳过,直到访问完所有节点为止。
const int MAXV 200;
const int INF 1e9;
int n,G[MAXV][MAXV];
bool vis[MAXV] = {false};
void DFS(int u,int depth){
vis[u] = true;
for(int v = 0; v<n; v++){
if(G[u][v]!=INF && vis[v] = false){
DFS(v,depth+1);
}
}
}
void DFSTrave(){
for(int u=0;u<n;u++){
if(vis[u] == false){
DFS(u,1);
}
}
}
const int MAXV 200;
const int INF 1e9;
int n;
vector<int> Adj[MAXV]
bool vis[MAXV] = {false};
void DFS(int u,int depth){
vis[u] = true;
for(int i = 0; i<Adj[u].size(); i++){
int v = Adj[u][i];
if(vis[v] = false){
DFS(v,depth+1);
}
}
}
void DFSTrave(){
for(int u=0;u<n;u++){
if(vis[u] == false){
DFS(u,1);
}
}
}