算法基础课——基础算法(模板整理)

 快速排序

快速排序

#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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/43619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4.物联网LWIP之C/S编程

LWIP配置 服务器端实现 客户端实现 错误分析 一。LWIP配置&#xff08;FREERTOS配置&#xff0c;ETH配置&#xff0c;LWIP配置&#xff09; 1.FREERTOS配置 为什么要修改定时源为Tim1&#xff1f;不用systick&#xff1f; 原因&#xff1a;HAL库与FREERTOS都需要使用systi…

leetcode做题笔记89. 格雷编码

n 位格雷码序列 是一个由 2n 个整数组成的序列&#xff0c;其中&#xff1a; 每个整数都在范围 [0, 2n - 1] 内&#xff08;含 0 和 2n - 1&#xff09;第一个整数是 0一个整数在序列中出现 不超过一次每对 相邻 整数的二进制表示 恰好一位不同 &#xff0c;且第一个 和 最后一…

C语言好题解析(三)

目录 选择题一选择题二选择题三选择题四编程题一编程题二 选择题一 以下程序段的输出结果是&#xff08;&#xff09;#include<stdio.h> int main() { char s[] "\\123456\123456\t"; printf("%d\n", strlen(s)); return 0; }A: 12 B: 13 …

Lnton羚通关于【PyTorch】教程:torchvision 目标检测微调

torchvision 目标检测微调 本教程将使用Penn-Fudan Database for Pedestrian Detection and Segmentation 微调 预训练的Mask R-CNN 模型。 它包含 170 张图片&#xff0c;345 个行人实例。 定义数据集 用于训练目标检测、实例分割和人物关键点检测的参考脚本允许轻松支持添加…

前端-轮询

一、轮询定义 轮询是指在一定的时间间隔内&#xff0c;定时向服务器发送请求&#xff0c;获取最新数据的过程。轮询通常用于从服务器获取实时更新的数据。 二、轮询和长轮询区别 轮询是在固定的时间间隔内向服务器发送请求&#xff0c;即使服务器没有数据更新也会继续发送请求…

暴力模拟入门+简单:零件组装、塔子的签到题、塔子哥考试、平均像素值、换座位

暴力模拟入门 P1038 小红书-2022.9.23-零件组装 #include <bits/stdc.h> #include <cstdint> using namespace std;typedef long long LL; const int N 100001; int num[4]; LL d; vector<vector<LL>> v(4, vector<LL>(N));int main() {for(in…

解决Pycharm的Settings中Project不见了也无法选择Python Interpreter的方法

目录 一、问题如下二、解决方法 一、问题如下 突然打开项目没有python解释器&#xff0c;也无法重新配置python Interpreter&#xff0c;而且整个文件夹是黄色高亮的形式&#xff0c;如下显示&#xff0c;而且重新安装了pycharm也没用甚至说打开File–>Setting–>Projec…

日常BUG——普通页面跳转tabbar页面报错

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 微信小程序页面跳转的时候出现下面的问题&#xff1a; wx.redirectTo({url: /pages/index/i…

Linux学习之基本指令二

-----紧接上文 在了解cat指令之前&#xff0c;我们首先要了解到Linux下一切皆文件&#xff0c;在学习c语言时我们就已经了解到了 对文件输入以及读入的操作&#xff08;向显示器打印&#xff0c;从键盘读取数据&#xff09;&#xff0c;对于Linux下文件的操作&#xff0c;也是…

算法与数据结构(二十三)动态规划设计:最长递增子序列

注&#xff1a;此文只在个人总结 labuladong 动态规划框架&#xff0c;仅限于学习交流&#xff0c;版权归原作者所有&#xff1b; 也许有读者看了前文 动态规划详解&#xff0c;学会了动态规划的套路&#xff1a;找到了问题的「状态」&#xff0c;明确了 dp 数组/函数的含义&a…

js简介以及在html中的2种使用方式(hello world)

简介 javascript &#xff1a;是一个跨平台的脚本语言&#xff1b;是一种轻量级的编程语言。 JavaScript 是 Web 的编程语言。所有现代的 HTML 页面都使用 JavaScript。 HTML&#xff1a; 结构 css&#xff1a; 表现 JS&#xff1a; 行为 HTMLCSS 只能称之为静态网页&#xff0…

Rust交叉编译简述 —— Arm

使用系统&#xff1a;WSL2 —— Kali(Microsoft Store) 命令列表 rustup target list # 当前官方支持的构建目标架构列表 rustup target add aarch64-unknown-linux-gnu # 添加目标架构sudo apt-get install gcc-13-aarch64-linux-gnu gcc-13-aarch64-linux-gnu # 下载目标工具…

github以及上传代码处理

最近在github上传代码的时候出现了&#xff1a; /video_parser# git push -u origin main Username for https://github.com: gtnyxxx Password for https://gtny2010github.com: remote: Support for password authentication was removed on August 13, 2021. remote: Plea…

ROS局部路径规划器插件teb_local_planner流程梳理(上)

在我之前的文章《ROS导航包Navigation中的 Movebase节点路径规划相关流程梳理》中已经介绍过Move_base节点调用局部路径规划器插件的接口函数是computeVelocityCommands&#xff0c;接下来&#xff0c;我们就从这个函数入手梳理一下teb_local_planner功能包的工作流程。 ☆注&a…

推荐一个绘图平台(可替代Visio)

不废话&#xff0c;简易记网址&#xff1a; draw.io 网站会重定向到&#xff1a;https://app.diagrams.net/

编程语言中的++和--运算符介绍

编程语言中的和--运算符介绍 和--是编程语言&#xff08;C/C、JavaScript、Java&#xff09;中的自增&#xff08;加一&#xff09;和自减&#xff08;减一&#xff09;运算符。它们可以应用于变量&#xff0c;并且具有前缀和后缀两种形式。 前缀形式&#xff1a; variable&…

Databend 开源周报第 106 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 数据脱敏 Data…

云原生 AI 工程化实践之 FasterTransformer 加速 LLM 推理

作者&#xff1a;颜廷帅&#xff08;瀚廷&#xff09; 01 背景 OpenAI 在 3 月 15 日发布了备受瞩目的 GPT4&#xff0c;它在司法考试和程序编程领域的惊人表现让大家对大语言模型的热情达到了顶点。人们纷纷议论我们是否已经跨入通用人工智能的时代。与此同时&#xff0c;基…

ISBN号码(NOIP2008 普及组第一题)

ISBN号码 说明 每一本正式出版的图书都有一个ISBN号码与之对应&#xff0c;ISBN码包括9位数字、1位识别码和3位分隔符&#xff0c;其规定格式如“x-xxx-xxxxx-x”&#xff0c;其中符号“-”就是分隔符&#xff08;键盘上的减号&#xff09;&#xff0c;最后一位是识别码&#x…

CCF C³ 走进百度:大模型与可持续生态发展

2023年8月10日&#xff0c;由CCF CTO Club发起的第22期C活动在百度北京总部进行&#xff0c;以“AI大语言模型技术与生态发展”主题&#xff0c;50余位企业界、学界专家、研究人员就此进行深入探讨。 CCF C走进百度 本次活动&#xff0c;CCF秘书长唐卫清与百度集团副总裁、深…