ACwing算法基础入门代码合集

ACwing算法基础入门代码合集

快速排序

786.第k个数
//第k个数
//算法思想:基于快速排序(分治)
#include<iostream>
using namespace std;
#define N 100010
int Partition(int a[], int low, int high);
int quicksort(int a[], int low, int high,int k)
{if (low == high) return a[low];int pviotment = Partition(a,low,high);int s1 = pviotment - low + 1;if (k <= s1) return quicksort(a, low, pviotment, k);else return quicksort(a,pviotment+1,high,k-s1);
}int Partition(int a[], int low, int high)
{int pviot = a[low];while (low<high){while (low < high && a[high] >= pviot)--high;a[low] = a[high];while (low < high && a[low] <= pviot)++low;a[high] = a[low];}a[high] = pviot;return low;
}
int main()
{int a[N];int n, k;cin >> n >> k;for (int i=0;i<n;i++){scanf("%d",&a[i]);}int res=quicksort(a,0,n-1,k);cout <<res;return 0;
}

归并排序

787.归并排序
//归并排序
//算法思想:基于分治与双指针
#include<iostream>
using namespace std;
#define N 100000int temp[N];
int merge_sort(int q[],int l, int r)//归并排序
{if (l >= r) return 0;int mid = l + r >> 1;merge_sort(q,l,mid);merge_sort(q,mid+1,r);int k = 0, i = l, j = mid + 1;while (i<=mid&&j<=r){if (q[i] <= q[j])temp[k++] = q[i++];elsetemp[k++] = q[j++];}//扫尾,将剩余的元素归到一个数组中while (i <= mid)temp[k++] = q[i++];while (j <= r)temp[k++] = q[j++];//物归原主for (int i = l, k = 0; i <= r; i++, k++)q[i] = temp[k];
}
int main()
{int n,q[N];cin >> n;for (int i = 0; i < n; i++)cin >> q[i];merge_sort(q, 0, n - 1);for (int i = 0; i < n; i++)cout << q[i]<<" ";return 0;
}
788.逆序对的数量
//求逆序数对
//算法思想:基于归并排序,注意事项:返回结果大于int的最大存储值,故要用long long来存储
#include<iostream>
using namespace std;
#define N 100010
int temp[N];long long  mergesort(int q[],int l,int r)
{if (l >= r) return 0;int mid = l + r >> 1;long long res = mergesort(q,l,mid) + mergesort(q,mid+1,r);int k = 0, i = l, j = mid + 1;while (i <= mid && j <= r){if (q[i] <= q[j])temp[k++] = q[i++];else{temp[k++] = q[j++];res += mid - i + 1;}}while (i <= mid)temp[k++] = q[i++];while (j <= r)temp[k++] = q[j++];//物归原主for (int i = l, j = 0; i <= r; i++, j++)q[i] = temp[j];return res;
}int main()
{int n,q[N];cin >> n;for (int i = 0; i < n; i++)scanf("%d",&q[i]);long long  res=mergesort(q,0,n-1);cout << res;return 0;
}

二分

789.数的范围
//数的范围
//算法思想:二分,基于分治
#include<iostream>
using namespace std;
#define N 100000int	q[N];
int n, m;int main()
{cin >> n >> m;for (int i = 0; i < n; i++){cin >> q[i];}while (m--){int x;cin >> x;int l = 0;int r = n - 1;while (l<r){int mid = l + r >> 1;//相当于除以二if (q[mid] >= x)//先求左边界,条件是分界点右边的值都大于等于分界点的值		r = mid;//若mid符合条件,则直接边界值等于mid,否则将mid+1else l = mid + 1;}if (q[l] != x)cout << "-1 -1" << endl;//若未找到数则返回-1 -1;else{cout << l << " ";int l = 0;int r = n - 1;while (l < r){int mid = l + r + 1 >> 1;if (q[mid] <= x)//再求右边界,条件是分界点左边的数都小于等于x的值l = mid;elser = mid - 1;}cout << r<< endl;}}return 0;
}
790.数的三次方根
//数的三次方根
//算法思想:基于二分
#include<iostream>
using namespace std;int main()
{double x;cin >> x;double r = 100000;double l = -100000;while (r - l > 1e-10){double mid = (r + l) / 2;if (mid * mid * mid >= x)r = mid;elsel = mid;}printf("%lf",l);return 0;
}

高精度

791.高精度加法(山西大学2023机试第三题)
//高精度加法
//算法思想:注意进位变化
#include<iostream>
#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 = t / 10;//进位}if (t)C.push_back(1);return C;
}int main()
{string a, b;vector<int> A,B;cin >> 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;
}
792.高精度减法
//高精度运算
//高精度减法
#include<iostream>
#include<vector>
using namespace std;bool cmp(vector<int> &A,vector<int> &B)//比较A与B的大小关系,判断A是否大于B
{if (A.size() != B.size())//先判断位数,位数大则大return A.size() > B.size();else//位数相同再逐位比较{for (int i = A.size() - 1; i >= 0; i--)if (A[i] != B[i])return A[i] > B[i];}return true;
}vector<int> sub(vector<int> &A,vector<int> &B)//C=A-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);//t值为正则直接压入C中,t值为负则+10压入C中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;vector<int> A, B;cin >> 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))//若A大于B则直接A-B{auto C = sub(A,B);for (int i = C.size() - 1; i >= 0; i--)cout << C[i];}else//若A小于B则执行(B-A)后在前面输出一个负号{auto C = sub(B,A);cout << '-';for (int i = C.size() - 1; i >= 0; i--)cout << C[i];}return 0;
}
793.高精度乘法
//高精度运算
#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 + t;//t等于当前值加进位C.push_back(t%10);//结果位t = t / 10;//进位}while (C.size() > 1 && C.back() == 0)C.pop_back();return C;
}int main()
{string a;int b;vector<int> A;cin >> a >> b;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;
}
794.高精度除法
//高精度运算
//高精度除法
#include<iostream>
#include<vector>
#include<algorithm>
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];//上一位的余数乘以10加当前位C.push_back(r/b);//求商r = 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,r;cin >> a >> b;vector<int> A;for (int i = a.size() - 1; i >= 0; i--)A.push_back(a[i]-'0');auto C = div(A,b,r);for (int i = C.size() - 1; i >= 0; i--)cout << C[i];cout << endl << r << endl;return 0;
}

前缀和与差分

795.前缀和
//前缀和
#include<iostream>
using namespace std;
#define N 100010int main()
{int n, m;int a[N],s[N];s[0] = 0;cin >> n >> m;for (int i = 1; i <=n; i++)scanf("%d",&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;//注意是l-1}return 0;
}
796.子矩阵的和
//子矩阵的和
//算法思想:前缀和
#include<iostream>
using namespace std;
#define N 1010int main()
{int a[N][N], s[N][N];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]);for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];//基本公式,初始化矩阵前缀和while (q--){int x1, y1, x2, y2;cin >> x1 >> y1 >> x2 >> y2;cout <<s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1]<<endl;}return 0;
}
797.差分
//差分
//算法思想:差分,便于求在l到r之间加上c这样的操作
#include<iostream>
using namespace std;#define N 100010
int a[N], b[N];void insert(int l,int r,int c)
{b[l] += c;b[r + 1] -= c;
}
int main()
{int n, q;cin >> n >> q;for (int i = 1; i <= n; i++)scanf("%d",&a[i]);for (int i = 1; i <= n; i++)insert(i, i, a[i]);//将b数组初始化为a数组的差分while (q--){int l, r,c;cin >> l >> r>>c;insert(l,r,c);//实现在l到r之间加上c}for (int i = 1; i <= n; i++)b[i] += b[i - 1];//求出b的前缀和即为加上c后的a数组for (int i = 1; i <= n; i++)printf("%d ",b[i]);return 0;
}

双指针算法

799.最长连续不重复子序列
//最长连续不重复子序列
//算法思想:双指针,双指针算法可以先想出一个暴力的解法,类似于双重循环,后将一重循环改为while使其时间复杂度降低
//基本模版为
/*
for(int i=0;i<n;i++)
{
while(j<i&&check(i,j))
{
i++;
j++;
}
}
*/
#include<iostream>
using namespace std;
#define N 100010
int a[N], s[N];
int subsequence(int n)
{int j = 0;int res = 0;for (int i = 0; i < n; i++){s[a[i]]++;//s数组记录重复的次数while (s[a[i]]>1)//若大于1即为重复,则让j指针向右移动来消除重复{s[a[j]]--;j++;}res = max(res,i-j+1);//结果即为i与j之间的长度}return res;
}
int main()
{int n;cin >> n;for (int i = 0; i < n; i++)scanf("%d",&a[i]);int res=subsequence(n);cout << res;return 0;
}
800.数组元素的和
//目标和
//算法思想:双指针
#include<iostream>
#include<algorithm>
using namespace std;
#define N 100010
int main()
{int n, m,x;int a[N], b[N];cin >> n >> m>>x;for (int i = 0; i < n; i++)cin >> a[i];for (int i = 0; i < m; i++)cin >> b[i];int j = m-1;for (int i = 0; i < n; i++)//令a数组从左向右遍历{while (j >= 0 && a[i] + b[j] > x)j--;//令b数组从右向左遍历if (a[i]+b[j]==x)//由于是唯一解,故只要找出一组值即可跳出{cout << i <<" "<< j;break;}}return 0;
}
2816.判断子序列
//子序列
//算法思想:双指针
#include<iostream>
using namespace std;
#define N 100010
int main()
{int n, m;int a[N], b[N];cin >> n >> m;for (int i = 0; i < n; i++)cin >> a[i];for (int i = 0; i < m; i++)cin >> b[i];int j = 0;for (int i = 0; i < m; i++){while (j<n&&a[j]==b[i])//当判断二者相同时要同步进位,防止有重复数字出现的情况{i++;j++;}}if (j == n)cout << "Yes";elsecout << "No";return 0;
}

位运算

801.二进制中1的个数
#include<iostream>
using namespace std;
#define N 100010
int main()
{int n,a[N];cin>>n;for(int i=0;i<n;i++)cin>>a[i];for(int i=0;i<n;i++)cout << __builtin_popcount(a[i]) << ' ';//OI可用return 0;
}

离散化

802.区间和
//区间和
//算法思想:离散化
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define N 300010
int a[N]={0}, s[N];
vector<int> relect;
vector<pair<int, int>> add, query;
int find(int x)
{int l = 0, r = relect.size() - 1;while (l < r){int mid = l + r >> 1;if (relect[mid] >= x) r = mid;else l = mid + 1;}return r + 1;
}
int main()
{int n, m;cin >> n >> m;for (int i=0;i<n;i++){int x, c;cin >> x >> c;add.push_back({x,c});relect.push_back(x);}for (int i=0;i<m;i++){int l, r;cin >> l >> r;query.push_back({l,r});relect.push_back(l);relect.push_back(r);}sort(relect.begin(),relect.end());relect.erase(unique(relect.begin(),relect.end()),relect.end());for (auto item : add){int x = find(item.first);a[x] += item.second;}for (int i = 1; i <= relect.size(); i++) s[i] = s[i - 1] + a[i];for (auto item : query){int l = find(item.first);int r = find(item.second);cout << s[r] - s[l - 1] << endl;}return 0;
}

区间合并

803.区间合并
//区间合并
//算法思想:贪心
#include<iostream>
#include<vector>
#include<Algorithm>
using namespace std;void merge(vector<pair<int,int>> &segs)
{vector<pair<int, int>> res;//存放返回的结果if (segs.size() > 0)//防止输入的值为空值{sort(segs.begin(),segs.end());//先按左端点进行排序,sort函数默认情况下按照pair的左端点进行排序int st = segs[0].first;//初始化当前比较区间为排好序的segs中的第一个区间值int ed = segs[0].second;for (auto seg:segs){if (ed < seg.first){res.push_back({st,ed});//若当前比较区间的左端点值小于下一个区间的右端点值则将st与ed放入res中st = seg.first;//更新当前比较区间的值ed = seg.second;}else{ed = max(ed,seg.second);//反之则将右端点值更新为当前的右端点值与下一个右端点中的最大值,就是区间合并的效果}}res.push_back({st,ed});	//将最后一个区间加入到res中}segs = res;
}
int main()
{int n;vector<pair<int, int>> segs;//使用pair进行区间的输入cin >> n;for (int i=0;i<n;i++){int l, r;cin >> l >> r;segs.push_back({l,r});}merge(segs);cout << segs.size();//segs的长度即为合并后的区间数量return 0;
}

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

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

相关文章

Java基础数据结构之排序

一.排序 1.什么是稳定性 假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&#xff0c;这些记录的相对次序保持 不变&#xff0c;即在原序列中&#xff0c; r[i]r[j] &#xff0c;且 r[i] 在 r[j] 之前&#xff0c;而在排序后的序…

php 文件上传

目录 1 php.ini 配置文件的修改 2.系统返回码详解 错误级别 4.上传简单示例 5.php代码简单优化 1 php.ini 配置文件的修改 配置项说明file_uploads on 为 开启文件上传功能&#xff0c; off 为关闭 post_max_size 系统允许的 POST 传参的最大值 &#xff0c;默认 8M upl…

【JSON2WEB】03 go的模板包html/template的使用

Go text/template 是 Go 语言标准库中的一个模板引擎&#xff0c;用于生成文本输出。它使用类似于 HTML 的模板语言&#xff0c;可以将数据和模板结合起来&#xff0c;生成最终的文本输出。 Go html/template包实现了数据驱动的模板&#xff0c;用于生成可防止代码注入的安全的…

电信宽带配置动态域名和端口映射

需求: 家宽映射动态域名访问内网服务 动态域名:18081>电信光猫:18081>Openwrt软路由:18081>主机192.168.3.172:8081 目前网络结构&#xff1a; 电信光猫192.168.1.1 Openwrt软路由192.168.3.1 主机192.168.3.172上8081端口起了一个nginx-docker服务 前置条件&#x…

【JavaWeb】MVC架构模式

文章目录 MVC是什么&#xff1f;一、M &#xff1a;Model 模型层二、V&#xff1a;View 视图层三、C&#xff1a;Controller 控制层四、非前后端分离MVC五、前后端分离MVC总结 MVC是什么&#xff1f; MVC&#xff08;Model View Controller&#xff09;是软件工程中的一种**软件…

【supervisor】unix:///tmp/supervisor.sock no such file

问题 supervisor在正常安装完时运行正常&#xff0c;但隔一段时间后出现了故障&#xff0c;重启后报&#xff1a; unix:///tmp/supervisor.sock no such file 原因是 supervisor 默认配置会把 socket 文件和 pid 守护进程生成在Linux的/tmp/目录下&#xff0c;/tmp/目录是缓存…

网页首页案例(使用框架:继上一篇博客结尾)

文章目录 新认识的快捷键1.先写好组件并导入App.vue2.往组件中一个一个填内容3.整体静态完成后&#xff0c;发现某些小部分相同&#xff0c;其实可以分装成小组件4.最后通过js动态渲染 新认识的快捷键 1.Ctrl滚轮按住往下拖可以部分选中 .用同样的方法选中下面的111&#xff0…

Redis学习指南(32)-Redis的性能瓶颈分析

Redis是一种高性能的键值存储数据库&#xff0c;它基于内存进行数据操作&#xff0c;因此具有非常快速的读写性能。然而&#xff0c;在实际使用中&#xff0c;Redis也会遇到一些性能瓶颈。本文将探讨几个可能导致Redis性能瓶颈的因素&#xff0c;并提供一些优化建议。 内存使用…

Java实现计算指定文件的SHA256

SHA-256 SHA-256&#xff08;Secure Hash Algorithm 256-bit&#xff09;是一种密码学安全哈希算法&#xff0c;用于将任意长度的数据转换为固定长度的哈希值&#xff0c;通常为256位&#xff08;32字节&#xff09;。SHA-256是SHA-2&#xff08;Secure Hash Algorithm 2&…

Spring Security 之 基本认证

基本认证 这部分提供了关于Spring Security如何为基于Servlet的应用程序提供基本HTTP认证支持的详细信息。 这部分描述了Spring Security中HTTP基本认证的工作原理。首先,我们看到WWW-Authenticate标头被发送回未经身份验证的客户端: 首先,用户对未经授权的资源 /private …

助力工业生产质检,基于YOLOv7【tiny/l/x】不同系列参数模型开发构建生产制造场景下布匹瑕疵缺陷检测识别分析系统

纯粹的工业制造没有办法有长久的发展过程&#xff0c;转制造为全流程全场景的生产智造才是未来最具竞争力的生产场景&#xff0c;在前面的开发实践中我们已经涉足工业生产场景下进行了很多实地的项目开发&#xff0c;如&#xff1a;PCB电路板缺陷检测、焊接缺陷检测、螺母螺钉缺…

利用tpu-mlir工具将深度学习算法模型转成算能科技平台.bmodel模型的方法步骤

目录 1 TPU-MLIR简介 2 开发环境搭建 2.1 下载镜像 2.2 下载SDK 2.3 创建容器 2.4 加载tpu-mlir 3 准备工作目录 4 onnx转mlir文件 5 mlir转INT8 模型 5.1 生成校准表 5.2 便以为INT8对称量化模型 参考文献&#xff1a; 之前是用nntc转算能科技的模型的&#xff0c…

YOLO 自己训练一个模型

一、准备数据集 我的版本是yolov8 8.11 这个目录结构很重要 ultralytics-main | datasets|coco|train|val 二、训练 编写yaml 文件 # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..] path…

dos 下查看磁盘信息

dos 下查看磁盘信息 1. win r 打开运行 输入 cmd 2. dos 命令行输入 diskpart C:\Users>diskpart 3. 会弹窗打开DiskPart 软件&#xff0c;输入 list volume Copyright (C) Microsoft Corporation. 在计算机上: DISKPART> list volume卷 ### LTR 标签 …

【每日一题】3.LeetCode——相交链表

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢迎各位大佬指点&…

向日葵远程控制Mac版权限设置教程解决远程无法控制问题

很多Mac新手安装向日葵远程控制Mac版后&#xff0c;根据提示设置了权限后发现无法远程控制&#xff0c;其实主要是你只勾选了中文的“向日葵权限选项“&#xff0c;而忘记了勾选了向日葵另外一个英文选项权限。 判断是否完全开启控制权限 打开向日葵访问权限设置面板&#xf…

VsCode CMake调试QT QString等变量不显示具体值,调试中查看qt源码 (可视化调试配置Natvis)

遇到的问题 当我们在VsCode使用CMake来调试QT程序时&#xff0c;可能会出现变量是十六进制的地址&#xff0c;而看不到具体的值。例如&#xff1a; 如何解决 这时候需要手动设置一下natvis &#xff08;资源以上传&#xff0c;可以直接下载&#xff09; 在.vscode文件下找到…

Android-System fastboot 介绍和使用

一、fastboot简介 在android手机中&#xff0c;fastboot是一种比recovery更底层的刷机模式。 实际操作中&#xff1a;fastboot是一种线刷&#xff0c;就是使用USB连接手机的一种刷机模式。相对于某些系统来说&#xff0c;线刷比卡刷更可靠&#xff0c;安全。recovery是一种卡刷…

分布式应用程序设计项目管理

1. 项目的定义 项目是一种特定的、新颖的行动&#xff0c;目的是以有条不紊、逐步的方式构建一个尚未存在确切对应物的未来现实。它是对精心制定的需求的回应&#xff0c;旨在满足业主的需要。项目包括一个可能是物理或智力的目标&#xff0c;并且需要使用给定的资源来执行一系…

LC 2865. 美丽塔 I

2865. 美丽塔 I 难度 : 中等 题目大意 给你一个长度为 n 下标从 0 开始的整数数组 maxHeights 。 你的任务是在坐标轴上建 n 座塔。第 i 座塔的下标为 i &#xff0c;高度为 heights[i] 。 如果以下条件满足&#xff0c;我们称这些塔是 美丽 的&#xff1a; 1 < heights…