- 博客(79)
- 收藏
- 关注
原创 图论最短路及生成树(Prim,Djikstra,Spfa,Bellan-ford,kruskal,topsort)
图论在算法中具有举足轻重的地位,只有学好图才能游刃有余。本文章将介绍图论中一些基础算法,可以说总结的十分全面,文章结尾也会分析各算法的差异,清晰易懂。并附上代码模板.图论(最短路、生成树)一、拓扑排序二、Djikstra算法1. 朴素算法2. 优先队列优化三、Bellan-ford算法四、Floyd算法五、Spfa算法1.求最短路2.判断负环六、Prim算法求最小生成树七、Kruskal算法求最小生成树八、一点问题:1、prim 和 dijkstra 的区别与联系:2、spfa 和 dijkstra
2021-10-03 17:19:04 420 1
原创 引入移码的目的
计算机表示浮点数难免会有精度损失。(表示分母是2的幂的浮点数可以完美表示)计算机IEEE标准规定计算机浮点数由三部分构成:符号位(s)、阶码(exp)、尾数(farc)single精度与double精度以及32、64位机表示阶码和尾数使用的bit都各不相同,一般来说,位数越多,精度越高。在规格化浮点数的时候,常常会规格化为1.xxxx的形式,因此比较浮点数的大小会十分方便。在比较浮点数的时候,由于是统一形式,人可以一眼比较出十进制中三位数大于两位数,因此大多数时候只需要比较阶码的大小即可比较出浮点数
2022-09-04 21:52:45 1164
原创 计算机底层-关于隐式转换和补码(困扰了我好几个月的问题)
问题:C语言程序在32位机器上运行。程序中定义了三个变量X、Y、Z,其中X和Z是int型,Y为short型。当X=127,Y=-9时,执行赋值语句Z=X+Y后,X、Y、Z的值分别是多少?(十六进制数表示)首先,计算机采用补码计算。按照正常的思路是这样的:很遗憾,这样是错误的!下面解释原因(困惑了我好几个月)先说答案:Z = 00000076H为什么会是这样?我的第一反应是答案错了。事实真是如此吗?我试着输出一下127的二进制:int x = 127;for(int i=31;i>
2022-05-05 13:24:52 955 1
原创 菁英班OJ赛2022-2-24(第一周)
题目链接目录文章目录目录一、硬币塔二、判断三角形三、星图四、非常大的N五、两条线段一、硬币塔题目:思路:预处理出每一级的总金币数,和每一级的规模。按照递归的思想进行dfs。注意特判边界就行了(n可以等于0).代码:#include<bits/stdc++.h> using namespace std;long long f[45]; //每一级的总金币数.long long sz[45]; //每一级的规模long long n,m;lon
2022-04-24 15:13:01 1568
原创 飞行员兄弟(暴力)
题目链接AcWing 116.#include <bits/stdc++.h>using namespace std;char s[5][5];char b[5][5];bool check(){ for(int i=0;i<4;i++) for(int j=0;j<4;j++) if(b[i][j]=='+') return false; return true;
2022-04-12 12:26:17 243
原创 最高的牛(差分)
题目链接AcWing 101.思路:记每头牛的初始身高为H,若a,b两头牛能看见,则他们之间的牛身高减一即可。利用差分数组记录区间修改即可。注意重复关系不要重复处理。/* 思路:记每头牛的初始身高为H,若a,b两头牛能看见,则他们之间的牛身高减一即可。 利用差分数组记录区间修改即可。注意重复关系不要重复处理。*/#include <bits/stdc++.h>using namespace std;int a[5050];int main(){
2022-04-12 12:26:00 167
原创 最佳牛围栏(二分、难点)
题目链接AcWing 102.思路易错点在代码上部。/* 二分平均值. 题目中有长度不小于L的限制(len>=L) check时判断是否存在sum - len * avg >= 0 可以转化为是否存在子段和sum(a[i]-avg)非负,且子段长度不小于L 子段和sum用前缀和维护. for(int i=1;i<=n;i++) b[i] = a[i] - avg; int minn = 1e9; int
2022-04-12 12:25:24 276
原创 七夕祭(贪心、难点)
题目链接AcWing 105.思路分析易错点均在代码中。/* 1.思考什么时候输出impossible 2.思考横向交换是否影响竖向交换? 不影响。 3.单独考虑一维的最少交换情况(这里讨论行,使得每一列数量均相等) 考虑均分纸牌问题,这里是环形均分纸牌问题. 分析: 均分纸牌: 记S[i]为第i个人获得了S[i]张牌(为正则为获得牌;为负则为给出牌)
2022-04-12 12:24:41 192
原创 增减序列(思维、难点)
题目链接AcWing 100.分析:区间操作,先转化为差分数组形式,那么最终答案的差分数组应该是 x 0 0 0 0 0 0 … 的形式。题目转化为:每次让差分数组的一个位置+1(或-1),另一个位置-1(或+1),位置的范围可以选择[1,n+1](1)使数组达到目标形式的次数最少容易想到一种贪心的策略:当数组中不存在负数时:一个位置选择非0的[2,n]的位置,另一个位置选择1或n+1即可。当数组中不存在正数时:同理。当数组中正负数都存在时:先每次选择一正一负,直到正数选完或者负数选完
2022-04-12 12:23:40 419
原创 激光炸弹(前缀和)
题目链接AcWing 99.思路在代码中。/* 目标数量10000,枚举每个目标作为矩形左上角,计算二维前缀和.*/#include <bits/stdc++.h>using namespace std;int n,r;int a[5050][5050];int main(){ std::ios::sync_with_stdio(false);std::cin.tie(nullptr); cin >> n >> r;
2022-04-11 21:38:18 131
原创 约数之和(分治,公式变形)
题目链接AcWing 97.本题有两种方法,公式法与求逆元,这里使用逆元求等比数列的和注意逆元不存在的情况(代码中有标注)/* 1.分治法 2.同余逆元 对于(a/b)%MOD 逆元不存在:等价于b % MOD = 0*/#include <bits/stdc++.h>using namespace std;typedef long long ll;const int MOD = 9901;int p[50000010],
2022-04-11 21:36:50 160
原创 费解的开关(状态压缩)
题目链接AcWing 95.思路:先枚举第一行的状态,再依次判断其他每个位置是否需要操作。代码:#include <bits/stdc++.h>using namespace std;char s[7][7];char b[7][7];int dx[4] = {0,0,1,-1};int dy[4] = {1,-1,0,0};void calc(char &c){ c = (char)(((c - '0') ^ 1) + '0');}void tr
2022-04-11 21:34:36 159
原创 递归实现排列型枚举(搜索)
题目链接AcWing 94.代码:#include <bits/stdc++.h>using namespace std;int a[11];int main(){ int n; cin >> n; for(int i=1;i<=n;i++) a[i] = i; do{ for(int i=1;i<=n;i++) cout << a[i] <<
2022-04-11 21:32:44 133
原创 递归实现组合型枚举(搜索)
题目链接AcWing 93.代码:#include <bits/stdc++.h>using namespace std;int book[30];int n,m;void dfs(int sz,int maxn){ //maxn记录当前最大值. if(n-maxn+sz<m){ //剪枝. return; } if(sz==m){ for(int i=1;i<=n;i++)
2022-04-11 21:31:41 125
原创 递归实现指数型枚举(搜索)
题目链接AcWing 92.代码:#include <bits/stdc++.h>using namespace std;int main(){ std::ios::sync_with_stdio(false);std::cin.tie(nullptr); int n; cin >> n; cout << "\n"; for(int i=1;i<1<<n;i++){ for(int
2022-04-11 21:30:26 120
原创 起床困难综合症(位运算)
题目链接AcWing 998.题意:最初攻击力不知道,给定m次位运算操作,计算经过m次位运算操作后的最大值。思路:在代码顶部混合位运算不具有分配律,交换律,结合律// 存在多个不同的位运算符号时,不具有结合律,因此不能先算后面/* x & 5 | 6 ^ 7 != x & (5 | 6 ^ 7) x = 2时,左边为1,右边为0*/// 思路:按位去判断,从高到低枚举每一位的两种情况.// 2^30 > 1e9#include <
2022-04-11 21:28:55 155
原创 最短Hamilton路径(状压DP)
题目链接AcWing 91.代码:(思路在注释)#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 21,M = 1 << N;int w[N][N];int f[M][N]; // 经过点的状态 ----- 当前所在的点.int main(){ int n; cin >>
2022-04-11 21:25:59 156
原创 64位整数乘法(类快速幂)
题目链接AcWing 90.代码#include <bits/stdc++.h>using namespace std;typedef long long ll;ll quick_mod(ll a,ll b,ll p){ ll res = 0; while(b){ if(b&1) res = (res + a) % p; b >>= 1; a = a * 2 % p; } re
2022-04-11 21:24:38 132
原创 a^b(快速幂)
题目链接AcWing89.代码#include <iostream>using namespace std;typedef long long ll;ll quick_mod(ll a,ll b,ll MOD){ ll res = 1; while(b){ if(b&1) res = res * a % MOD; b >>= 1; a = a * a % MOD; } retu
2022-04-11 21:23:20 175
原创 容斥原理babiQ
容斥原理:选择了奇数个集合则加、偶数个则减,利用二进制状态压缩枚举所有情况。ABC_246_F:题目链接题意:给定N个字符串,从中间选择一个字符串中的字符可以任意重复使用,组成长度为L的字符串有多少种方案。1≤N≤18.tips:看题目范围,枚举每一种情况,复杂度在2^n级别tips:结合上面提到的容斥原理,利用bitset内置函数set()统计1的个数.bitset<26> b[20];void solveF(){ ll n,l; cin >>.
2022-04-05 15:19:48 422
原创 李煜东算法进阶指南打卡题解
算法竞赛进阶指南一、0x00 基本算法1)位运算2)递推与递归3)前缀和与差分4)二分5)排序6)倍增7)贪心8)习题二、0x10 基本数据结构1)栈2)队列3)链表与邻接表4)Hash5)字符串6)Trie字典树7)二叉堆8)习题三、0x20 搜索1)树与图的遍历2)DFS3)剪枝4)迭代加深5)BFS6)广搜变形7)A*8)IDA*9)习题四、0x30 数学知识1)质数2)约数3)同余4)矩阵乘法5)高斯消元与线性空间6)组合计数7)容斥原理与Mobius函数8)概率与数学期望9)0/1分数规划10)博
2022-04-05 15:07:37 2257 2
原创 树状数组babiQ
树状数组,这工具人真好用,补下模板题,一家人就要整整齐齐。AcWing 241. 楼兰图腾题目链接四个月前写了一次,现在又写了一次,两次虽处理方式不同,异曲同工.#include <bits/stdc++.h>using namespace std;#define int long longtypedef long long ll;const int N = 200010;int tr[N];int a[N],rt[N],lf[N];int n;int lowb
2022-04-05 14:59:07 464
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人