算法基础课——基础算法(模板整理)
快速排序
快速排序
#include <iostream>
#include <algorithm>
using namespace std;
int n;
int s[100000];
int main()
{cin>>n;for(int i=0;i<n;i++){cin>>s[i];}sort(s,s+n);for(int i=0;i<n;i++){cout<<s[i]<<" ";}cout<<endl;return 0;
}
第K个数
#include <iostream>
#include <algorithm>
using namespace std;
int a[100005];
int main()
{int n,k;cin>>n>>k;for(int i=1;i<=n;i++){cin>>a[i];}nth_element(a+1,a+k,a+1+n);cout<<a[k]<<endl;return 0;
}
归并排序
归并排序
#include <iostream>
using namespace std;
const int N = 100010;
int n;
int q[N],tmp[N];
void merge_sort(int q[],int l,int r)
{if(l>=r){return;}int mid=(l+r)>>1;merge_sort(q,l,mid);merge_sort(q,mid+1,r);int k=1,i=l,j=mid+1;while(i<=mid&&j<=r){if(q[i]<=q[j]){tmp[k++]=q[i++];}else{tmp[k++]=q[j++];}}while(i<=mid){tmp[k++]=q[i++];}while(j<=r){tmp[k++]=q[j++];}for(int i=l,j=1;i<=r;i++,j++){q[i]=tmp[j];}
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&q[i]);}merge_sort(q,1,n);for(int i=1;i<=n;i++){printf("%d ",q[i]);}return 0;
}
逆序对的数量
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 100010;
int n;
int q[N],tmp[N];
ll merge_sort(int l,int r)
{if(l>=r){return 0;}int mid = (l+r)>>1;ll res=merge_sort(l,mid)+merge_sort(mid+1,r);//归并的过程int k=1,i=l,j=mid+1;while(i<=mid&&j<=r){if(q[i]<=q[j]){tmp[k++]=q[i++];}else{tmp[k++]=q[j++];res+=(mid-i+1);}}//扫尾while(i<=mid){tmp[k++]=q[i++];}while(j<=r){tmp[k++]=q[j++];}//物归原主for(int i=l,j=1;i<=r;i++,j++){q[i]=tmp[j];}return res;
}
int main()
{cin>>n;for(int i=1;i<=n;i++){cin>>q[i];}cout<<merge_sort(1,n)<<endl;return 0;
}
二分
数的范围
#include <iostream>
using namespace std;
const int N = 100010;
int q[N];
int main()
{int n,m;cin>>n>>m;for(int i=0;i<n;i++){cin>>q[i];}while(m--){int x;cin>>x;int l=0,r=n-1;while(l<r){int mid=l+r>>1;if(q[mid]>=x){r=mid;}else l=mid+1;}if(q[l]!=x){cout<<"-1 -1"<<endl;}else{cout<<l<<" ";l=0;r=n-1;while(l<r){int mid=l+r+1>>1;if(q[mid]<=x){l=mid;}else r=mid-1;}cout<<l<<endl;}}return 0;
}
数的三次方根
#include <iostream>
using namespace std;
int main()
{double n;cin>>n;double l=-10000,r=10000;while(r-l>1e-8){double mid = (l+r)/2;if(mid*mid*mid>=n){r=mid;}else l=mid;}printf("%.6lf\n",l);return 0;
}
高精度
高精度加法
Python一行就可以解决
print(int(input())+int(input()))
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<int> add(vector<int> &A,vector<int> &B)
{vector<int>C;int t=0;for(int i=0;i<A.size()||i<B.size();i++){if(i<A.size()){t+=A[i];}if(i<B.size()){t+=B[i];}C.push_back(t%10);t/=10;}if(t){C.push_back(t);}return C;
}
int main()
{string a,b;cin>>a>>b;vector<int>A,B;for(int i=a.size()-1;i>=0;i--){A.push_back(a[i]-'0');}for(int i=b.size()-1;i>=0;i--){B.push_back(b[i]-'0');}auto C = add(A,B);for(int i=C.size()-1;i>=0;i--){cout<<C[i];}return 0;
}
高精度减法
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//判断是否有A>=B
bool cmp(vector<int> &A,vector<int> &B)
{if(A.size()!=B.size()){return A.size()>B.size();}for(int i=A.size()-1;i>=0;i--){if(A[i]!=B[i]){return A[i]>B[i];}}return true;
}
//C=A-B
vector<int> sub(vector<int> &A,vector<int> &B)
{vector<int>C;int t=0;for(int i=0;i<A.size();i++){t=A[i]-t;if(i<B.size()){t-=B[i];}C.push_back((t+10)%10);if(t<0){t=1;}else t=0;}while(C.size()>1&&C.back()==0){C.pop_back();}return C;
}
int main()
{string a,b;cin>>a>>b;vector<int>A,B;for(int i=a.size()-1;i>=0;i--){A.push_back(a[i]-'0');}for(int i=b.size()-1;i>=0;i--){B.push_back(b[i]-'0');}if(cmp(A,B)){auto C = sub(A,B);for(int i=C.size()-1;i>=0;i--){cout<<C[i];}}else{auto C = sub(B,A);cout<<"-";for(int i=C.size()-1;i>=0;i--){cout<<C[i];}}return 0;
}
高精度乘法
#include <iostream>
#include <vector>
using namespace std;
vector<int> mul(vector<int>& A, int b)
{vector<int>C;int t = 0;for (int i = 0; i < A.size() || t; i++){if (i < A.size()){t += A[i] * b;}C.push_back(t % 10);t /= 10;}while(C.size()>1&&C.back()==0){C.pop_back();}return C;
}
int main()
{string a;int b;cin >> a >> b;vector<int>A;for (int i = a.size() - 1; i >= 0; i--){A.push_back(a[i] - '0');}auto C = mul(A, b);for (int i = C.size() - 1; i >= 0; i--){cout << C[i];}return 0;
}
高精度除法
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> div(vector<int>& A, int b,int &r)
{vector<int>C;r=0;for (int i = A.size()-1; i >= 0; i--){r = r * 10 + A[i];C.push_back(r/b);r%=b;}reverse(C.begin(),C.end());while(C.size()>1&&C.back()==0){C.pop_back();}return C;
}
int main()
{string a;int b;cin >> a >> b;vector<int>A;for (int i = a.size() - 1; i >= 0; i--){A.push_back(a[i] - '0');}int r;auto C = div(A, b,r);for (int i = C.size() - 1; i >= 0; i--){cout << C[i];}cout<<endl<<r<<endl;return 0;
}
前缀和与差分
前缀和
#include <iostream>
using namespace std;
const int N = 100005;
int a[N],s[N];
int main()
{int n,m;cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=n;i++){s[i]=s[i-1]+a[i];}while(m--){int l,r;cin>>l>>r;cout<<s[r]-s[l-1]<<endl;}return 0;
}
子矩阵的和
#include <iostream>
using namespace std;
const int N = 1010;
int a[N][N], s[N][N];
int main()
{int n, m, q;cin >> n >> m >> q;for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++){scanf("%d", &a[i][j]);s[i][j] = s[i][j - 1] + s[i - 1][j] - s[i - 1][j - 1] + a[i][j]; // 求前缀和}while (q--) {int x1,y1,x2,y2;scanf("%d%d%d%d", &x1, &y1, &x2, &y2);// 算子矩阵的和printf("%d\n", s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1]); }return 0;
}
差分
#include <iostream>
using namespace std;
const int N = 100010;
int n,m;
int a[N],b[N];
void insert(int l,int r,int c)
{b[l]+=c;b[r+1]-=c;
}
int main()
{cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=n;i++){insert(i,i,a[i]);}while(m--){int l,r,c;cin>>l>>r>>c;insert(l,r,c);}for(int i=1;i<=n;i++){b[i]+=b[i-1];}for(int i=1;i<=n;i++){cout<<b[i]<<" ";}return 0;
}
差分矩阵
#include <iostream>
using namespace std;
const int N = 1010;
int n,m,q;
int a[N][N],b[N][N];
void insert(int x1,int y1,int x2,int y2,int c)
{b[x1][y1]+=c;b[x2+1][y1]-=c;b[x1][y2+1]-=c;b[x2+1][y2+1]+=c;
}
int main()
{cin>>n>>m>>q;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a[i][j];}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){insert(i,j,i,j,a[i][j]);}}while(q--){int x1,y1,x2,y2,c;cin>>x1>>y1>>x2>>y2>>c;insert(x1,y1,x2,y2,c);}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){b[i][j]+=b[i-1][j]+b[i][j-1]-b[i-1][j-1];}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cout<<b[i][j]<<" ";}cout<<endl;}return 0;
}
双指针算法
最长连续不重复子序列
#include <iostream>
using namespace std;
const int N = 100010;
int n;
int a[N],s[N];
int main()
{cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}int res=0;for(int i=1,j=1;i<=n;i++){s[a[i]]++;while(s[a[i]]>1){s[a[j]]--;j++;}res=max(res,i-j+1);}cout<<res<<endl;return 0;
}
数组元素的目标和
#include <iostream>
using namespace std;
const int N = 100005;
int n,m,x;
int a[N],b[N];
int main()
{cin>>n>>m>>x;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=m;i++){cin>>b[i];}for(int i=1,j=m;i<=n;i++){while(j>=1&&a[i]+b[j]>x) j--;if(a[i]+b[j]==x){cout<<i-1<<" "<<j-1<<endl;break;}}return 0;
}
判断子序列
#include <iostream>
using namespace std;
const int N = 100005;
int n,m;
int a[N],b[N];
int main()
{cin>>n>>m;for(int i=0;i<n;i++){cin>>a[i];}for(int i=0;i<m;i++){cin>>b[i];}int i=0,j=0;while(i<n&&j<m){if(a[i]==b[j])i++;j++;}if(i==n){cout<<"Yes"<<endl;}else{cout<<"No"<<endl;}return 0;
}
位运算
二进制中1的个数
#include <iostream>
using namespace std;
int lowbit(int x)
{return x & -x;
}
int main()
{int n;cin>>n;while(n--){int x;cin>>x;int res=0;while(x){x-=lowbit(x);res++;}cout<<res<<" ";}return 0;
}
离散化
区间和
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 300010; //n次插入和m次查询相关数据量的上界
int n, m;
int a[N];//存储坐标插入的值
int s[N];//存储数组a的前缀和
vector<int> alls; //存储(所有与插入和查询有关的)坐标
vector<pair<int, int>> add, query; //存储插入和询问操作的数据int find(int x)
{ //返回的是输入的坐标的离散化下标int l = 0, r = alls.size() - 1;while (l < r) {int mid = l + r >> 1;if (alls[mid] >= x) r = mid;else l = mid + 1;}return r + 1;
}int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++) {int x, c;scanf("%d%d", &x, &c);add.push_back({x, c});alls.push_back(x);}for (int i = 1; i <= m; i++) {int l , r;scanf("%d%d", &l, &r);query.push_back({l, r});alls.push_back(l);alls.push_back(r);}//排序,去重sort(alls.begin(), alls.end());alls.erase(unique(alls.begin(), alls.end()), alls.end());//执行前n次插入操作for (auto item : add) {int x = find(item.first);a[x] += item.second;}//前缀和for (int i = 1; i <= alls.size(); i++) s[i] = s[i-1] + a[i];//处理后m次询问操作for (auto item : query) {int l = find(item.first);int r = find(item.second);printf("%d\n", s[r] - s[l-1]);}return 0;
}
区间和并
区间和并
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef pair<int,int>pii;
const int N = 100010;
int n;
vector<pii>segs;
void merge(vector<pii>&segs)
{vector<pii>res;sort(segs.begin(),segs.end());int st=-2e9,ed=-2e9;for(auto seg:segs){if(ed<seg.first){if(ed!=-2e9) res.push_back({st,ed});st=seg.first;ed=seg.second;}else ed=max(ed,seg.second);}if(st!=2e9) res.push_back({st,ed});cout<<res.size()<<endl;
}
int main()
{cin>>n;for(int i=0;i<n;i++){int l,r;cin>>l>>r;segs.push_back({l,r});}merge(segs);return 0;
}
相关文章:
算法基础课——基础算法(模板整理)
快速排序 快速排序 #include <iostream> #include <algorithm> using namespace std; int n; int s[100000]; int main() {cin>>n;for(int i0;i<n;i){cin>>s[i];}sort(s,sn);for(int i0;i<n;i){cout<<s[i]<<" ";}cout<…...
如何解决使用npm出现Cannot find module ‘XXX\node_modules\npm\bin\npm-cli.js’错误
遇到问题:用npm下载组件时出现Cannot find module ‘D:software\node_modules\npm\bin\npm-cli.js’ 问题,导致下载组件不能完成。 解决方法:下载缺少的npm文件即可解决放到指定node_modules目录下即可解决。 分析问题࿱…...
【华为认证数通高级证书实验-分享篇2】
实验拓扑 注:代码块为各交换机路由器中的配置命令 配置拓扑文件 实验要求 实现全网通 实验配置 SW3 [SW3]v b 10 20 [SW3]int e0/0/1 [SW3-Ethernet0/0/1]po link-t a [SW3-Ethernet0/0/1]po de v 10 [SW3-Ethernet0/0/1]int e0/0/2 [SW3-Ethernet0/0/2]po li…...
ui设计需要学编程吗难不难学习 优漫动游
ui设计需要学编程吗难不难学习,对于基础小白来说学习编程确实有一定难度,所以很想知道零基础学习ui设计需要学编程吗,需不需要写代码呢,这些问题小编来简单的分析分析解决零基础小白的一些困惑,希望对你有帮助。 ui…...
什么是线程优先级?Java中的线程优先级是如何定义和使用的?
线程优先级是指在多线程环境中,通过给线程分配不同的优先级来决定线程获取CPU时间片的顺序。优先级较高的线程会更有可能被调度执行,而优先级较低的线程可能会获得较少的CPU时间。 在Java中,线程优先级是通过整数表示的,范围从1到…...
无涯教程-TensorFlow - XOR实现
在本章中,无涯教程将学习使用TensorFlow的XOR实现,在TensorFlow中开始XOR实施之前,看一下XOR表值。这将帮助了解加密和解密过程。 A B A XOR B 0 0 0 0 1 1 1 0 1 1 1 0 XOR密码加密方法基本上用于加密,即通过生成与适当密钥匹配…...
计算机组成与设计 Patterson Hennessy 笔记(二)MIPS 指令集
计算机的语言:汇编指令集 也就是指令集。本书主要介绍 MIPS 指令集。 汇编指令 算数运算: add a,b,c # abc sub a,b,c # ab-cMIPS 汇编的注释是 # 号。 由于MIPS中寄存器大小32位,是基本访问单位,因此也被称为一个字 word。M…...
【设计模式】模板方法模式(Template Method Pattern)
23种设计模式之模板方法模式(Template Method Pattern) 基本概念 模板方法模式是一种行为型设计模式,它定义了一个算法骨架,将某些算法步骤的实现延迟到子类中。 这样可以使得算法的框架不被修改,但是具体的实现可以…...
【潮州饶平】联想 IBM x3850 x6 io主板故障 服务器维修
哈喽 最近比较忙也好久没有更新服务器维修案例了,这次分享一例潮州市饶平县某企业工厂一台IBM System x3850 x6服务器亮黄灯告警且无法正常开机的服务器故障问题。潮州饶平ibm服务器维修IO主板故障问题 故障如下图所示: 故障服务器型号:IBM 或…...
【AIGC】 国内版聊天GPT
国内版聊天GPT 引言一、国内平台二、简单体验2.1 提问2.2 角色扮演2.3 总结画图 引言 ChatGPT是OpenAI发开的聊天程序,功能强大,可快速获取信息,节省用户时间和精力,提供个性化的服务。目前国产ChatGPT,比如文心一言&a…...
如何在Vue中进行单元测试?什么是Vue的模块化开发?
1、如何在Vue中进行单元测试? 在Vue中进行单元测试可以提高代码的可维护性和可读性,同时也能够帮助开发者更快地找到代码中的问题和潜在的错误。下面是一些在Vue中进行单元测试的步骤: 安装单元测试工具 首先需要安装一个单元测试工具&…...
Matlab编程示例3:Matlab求二次积分的编程示例
1.在MATLAB中,可以使用符号计算工具箱(Symbolic Math Toolbox)中的int函数来求解二次积分。 2.下面是一个简单的MATLAB程序示例,演示二次函数f (x,y) x^2 y^2,在x∈[0 1]和y∈[0 1]的积分区间上,计算积分结果: syms…...
【Linux】线程同步和死锁
目录 死锁 什么是死锁 构成死锁的四个必要条件 如何避免死锁 线程同步 同步的引入 同步的方式 条件变量 条件变量的使用 整体代码 死锁 什么是死锁 死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所占用不会释放 的资源而处…...
Matplotlib数据可视化(二)
目录 1.rc参数设置 1.1 lines.linestype取值 1.2 lines.marker参数的取值 1.3 绘图中文预设 1.4 示例 1.4.1 示例1 1.4.2 示例2 1.rc参数设置 利用matplotlib绘图时为了让绘制出的图形更加好看,需要对参数进行设置rc参数设置。可以通过以下代码查看matplotli…...
图像去雨-雨线清除-图像处理-(计算机作业附代码)
背景 多年来,图像去雨已经被广泛研究,使用传统方法和基于学习的方法。然而,传统方法如高斯混合模型和字典学习方法耗时,并且无法很好地处理受到严重雨滴影响的图像块。 算法 通过考虑雨滴条状特性和角度分布,这个问…...
pycharm调整最大堆发挥最大
python程序运行时,怎么提高效率,设置pycharm最大堆过程如下; 一、进入设置pycharm最大堆; 二、进入设置pycharm最大堆; 如果8g设置为6g左右,占75%左右最佳...
uni-app 经验分享,从入门到离职(二)—— tabBar 底部导航栏实战基础篇
文章目录 📋前言⏬关于专栏 🎯关于小程序 tabbar 的一些知识🎯创建一个基本的 tabBar📝最后 📋前言 这篇文章的内容主题是关于小程序的 tabBar 底部导航栏的入门使用和实战技巧。通过上一篇文章的基础,我们…...
【李沐】3.2线性回归从0开始实现
%matplotlib inline import random import torch from d2l import torch as d2l1、生成数据集: 看最后的效果,用正态分布弄了一些噪音 上面这个具体实现可以看书,又想了想还是上代码把: 按照上面生成噪声,其中最后那…...
一百五十六、Kettle——Linux上安装的Kettle9.3连接ClickHouse数据库(亲测,附流程截图)
一、目标 kettle9.3在Linux上安装好后,需要与ClickHouse数据库建立连接 二、前提准备 (一)在Linux已经安装好kettle并可以启动kettle (二)已知kettle和ClickHouse版本 1、kettle版本是9.3 2、ClickHouse版本是21…...
图数据库_Neo4j和SpringBoot整合使用_创建节点_删除节点_创建关系_使用CQL操作图谱---Neo4j图数据库工作笔记0009
首先需要引入依赖 springboot提供了一个spring data neo4j来操作 neo4j 可以看到它的架构 这个是下载下来的jar包来看看 有很多cypher对吧 可以看到就是通过封装的驱动来操作graph database 然后开始弄一下 首先添加依赖...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
AD学习(3)
1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分: (1)PCB焊盘:表层的铜 ,top层的铜 (2)管脚序号:用来关联原理图中的管脚的序号,原理图的序号需要和PCB封装一一…...
Linux基础开发工具——vim工具
文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...
高端性能封装正在突破性能壁垒,其芯片集成技术助力人工智能革命。
2024 年,高端封装市场规模为 80 亿美元,预计到 2030 年将超过 280 亿美元,2024-2030 年复合年增长率为 23%。 细分到各个终端市场,最大的高端性能封装市场是“电信和基础设施”,2024 年该市场创造了超过 67% 的收入。…...
2025 后端自学UNIAPP【项目实战:旅游项目】7、景点详情页面【完结】
1、获取景点详情的请求【my_api.js】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http(/login/getWXSessionKey, {code,avatar}); };//…...
TI德州仪器TPS3103K33DBVR低功耗电压监控器IC电源管理芯片详细解析
1. 基本介绍 TPS3103K33DBVR 是 德州仪器(Texas Instruments, TI) 推出的一款 低功耗电压监控器(Supervisor IC),属于 电源管理芯片(PMIC) 类别,主要用于 系统复位和电压监测。 2. …...
