随笔分类 -  算法

摘要:区间不相交问题 给出n个开区间,从中选出尽可能区间,使这些区间两两之间没有交集 #include<iostream> #include<algorithm> using namespace std; const int maxn = 30; //给出n个开区间,从中选出尽可能区间,使这些区间两两之间 阅读全文
posted @ 2021-09-16 10:21 小帆敲代码 阅读(24) 评论(0) 推荐(0) 编辑
摘要:选择排序 从第[i,n]中挑选最小的元素,使其与A[i]交换 代码 //选择排序 int datas[]; int n; void selectSort() { for (int i = 0; i < n; i++) { int minIndex = i; for (int j = i + 1; j 阅读全文
posted @ 2021-09-16 09:53 小帆敲代码 阅读(26) 评论(0) 推荐(0) 编辑
摘要:问题原因 原因在于计算机内部的加减乘除运算是通过加法器二进制运算来完成的,而二进制是无法准确表示一个浮点数的,只能在有限的精度内逼近这个值。 因此我们可以通过把一些数据扩大一定的倍数进行运算,最后再除去扩大的倍数。(详情见代码) AC代码 #include<stdio.h> int main(){ 阅读全文
posted @ 2021-09-13 22:04 小帆敲代码 阅读(30) 评论(0) 推荐(0) 编辑
摘要:sprintf属于标准输入输出函数之一,声明位于stdio.h文件,具体的声明格式为: int __cdecl sprintf(char * __restrict__ _Dest,const char * __restrict__ _Format,...) 不同点在于输出的目标为指定的缓存区域而不是 阅读全文
posted @ 2021-09-13 13:55 小帆敲代码 阅读(356) 评论(0) 推荐(0) 编辑
摘要:sscanf函数原型为: int sscanf(const char *buffer , const char *format , [argument ]...); 参数说明: buffer 为存储的数据 format 为格式控制字符串 argument 选择性设定字符串 函数功能: 从一个字符串中 阅读全文
posted @ 2021-09-13 13:52 小帆敲代码 阅读(627) 评论(0) 推荐(0) 编辑
摘要:方法一 hash //方法一 hash const int maxn = 10000; int hashTable[maxn];//计算hash[i]的个数 int main() { int n,k; scanf("%d%d", &n,&k); fill(hashTable, hashTable + 阅读全文
posted @ 2021-09-10 21:55 小帆敲代码 阅读(53) 评论(0) 推荐(0) 编辑
摘要:什么是BIT lowbit(x)=x&(-x)其实是取最右边的1和这个1左边的所有0; 树形数组的含义是c表示以x结尾,然后向前覆盖lowbit(x)长度的整数之和 主要思想其实包含两点 一点是插入的时候更新的是所有与A[i]相关的c;二是求和的时候计算的是使用递推公式。 问题描述 给定一个含有N个 阅读全文
posted @ 2021-09-10 20:25 小帆敲代码 阅读(30) 评论(0) 推荐(0) 编辑
摘要:字符串Hash 主要思想 使用进制转化的方法表示字符串 给出N个只有小写字母的字符串,求其中不同的字符串的个数 const int MOD = 1000000007;//使用这两个数可以有效避免冲突 const int F = 10000019; vector<int>ans; string a, 阅读全文
posted @ 2021-09-09 22:48 小帆敲代码 阅读(28) 评论(0) 推荐(0) 编辑
摘要:DP 一个具有重叠子问题和最优子结构的问题,才可以使用动态规划 状态的无后效性:即已有的状态不会随着后面转变 避免重复计算 斐波那契数列 //斐波那契数列 //F0=1,F1=1,Fn=Fn-1+Fn-2 #include<algorithm> using namespace std; const 阅读全文
posted @ 2021-09-09 21:39 小帆敲代码 阅读(34) 评论(0) 推荐(0) 编辑
摘要:关键路径 目标是求每一个活动的最早开始时间和最迟开始时间 ve[i]=max(ve[ik]+length[r]);k是i的前驱结点 vl[i]=min(vl[ki]-length[r];k是i的后继结点 e[i]=ve[i] l[i]=vl[ki]-length[r]k是r的邻接点 拓扑排序可以保证 阅读全文
posted @ 2021-09-07 09:58 小帆敲代码 阅读(31) 评论(0) 推荐(0) 编辑
摘要:DAG 单向无环图 拓扑排序 代码 #include<iostream> #include<vector> #include<queue> using namespace std; //DAG:有向无环图 const int max_n = 30; vector<int>G[max_n]; queu 阅读全文
posted @ 2021-09-07 08:47 小帆敲代码 阅读(21) 评论(0) 推荐(0) 编辑
摘要:定义 在无向图中 生成一棵树,这棵树涵盖所有顶点,且权值之和最小 性质 边数=n-1 对于给定的图,最小生成树可能不唯一,但是权值之和一定唯一 每一个结点都是平等的(因为来源于图) O(v2),可以用堆优化为O(VlogV+E) ##代码 ###邻接矩阵 #include<algorithm> us 阅读全文
posted @ 2021-09-06 21:36 小帆敲代码 阅读(75) 评论(0) 推荐(0) 编辑
摘要:主要思想 多源最短路径 向[i][j]中插入点k 如果可以更新 就更新 代码 const int max_n = 30; const int INF = 0x3fffffff; int n,G[max_n][max_n]; int d[max_n][max_n];//i到j的最短距离 void Fl 阅读全文
posted @ 2021-09-06 19:36 小帆敲代码 阅读(22) 评论(0) 推荐(0) 编辑
摘要:优化的Bellman_Ford算法 因为Bellman_Ford的时间复杂度O(VE).当Bellman_Ford中的顶点被松弛时,与之相连的顶点才有可能被松弛。因此,可以维护一个队列。当队列中的v被松弛时,将v入队(对其的邻接点操作)。当某个结点v入队次数超过v-1说明,此时有负环。 O(kE)k 阅读全文
posted @ 2021-09-06 18:48 小帆敲代码 阅读(33) 评论(0) 推荐(0) 编辑
摘要:主要思想 一张图和一个源点,当最短路径确定时,这个图的最短路径树一定是确定的。且深度不超过V(<=V) 但是 如果超过V层还可以松弛(说明出现了负环) 注意点 初始化,比如vis数组的false 最小路径的INF 将源点的d[s]=0 代码 #include<vector> using namesp 阅读全文
posted @ 2021-09-06 15:55 小帆敲代码 阅读(35) 评论(0) 推荐(0) 编辑
摘要:定义 求解单元路径问题 邻接矩阵 O(V2) #include<stdio.h> #include<algorithm> using namespace std; //Dijkstra算法 //邻接矩阵 const int max_n = 30; const int INF = 0x3fffffff 阅读全文
posted @ 2021-09-06 15:01 小帆敲代码 阅读(34) 评论(0) 推荐(0) 编辑
摘要:主要区别 最主要的区别是memset是按照字节填充的。 fill 按照单元赋值,将一个区间的元素都赋予val值。函数参数:fill(vec.begin(), vec.end(), val); val为将要替换的值。 #include <algorithm> fill(vec.begin(), vec 阅读全文
posted @ 2021-09-06 07:59 小帆敲代码 阅读(200) 评论(0) 推荐(0) 编辑
摘要:图的DFS遍历 邻接矩阵 节点个数小于1000时一般使用邻接矩阵 const int MAXV = 1000;//最大顶点数 const int INF = 1000000000; //邻接矩阵 int n, G[MAXV][MAXV];//n为顶点数 MAXV为最大顶点数 bool vis[MAX 阅读全文
posted @ 2021-09-05 15:02 小帆敲代码 阅读(22) 评论(0) 推荐(0) 编辑
摘要:使用优先队列的哈夫曼树 #include<iostream> #include<stdio.h> #include <vector> #include<queue> using namespace std; priority_queue<long long, vector<long long>, g 阅读全文
posted @ 2021-09-05 10:23 小帆敲代码 阅读(29) 评论(0) 推荐(0) 编辑
摘要:定义 堆 堆是一棵完全二叉树 树中每个结点的值均不大于(或不小于)左右孩子结点的值 一般使用优先队列实现 向下调整 因为向下调整默认调整的节点后面的都是排好序的,所以在使用向下调整时,都是从后往前 //向下调整:把欲调整结点与子节点比较 void downAdjust(int low,int hig 阅读全文
posted @ 2021-09-05 10:04 小帆敲代码 阅读(35) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示