第一章 基础算法(二)

文章目录

  • 高精度
    • 高精度加法
    • 高精度减法
    • 高精度乘法
    • 高精度除法
  • 前缀和
    • 一维前缀和
    • 二维前缀和--求子矩阵中一部分和
  • 差分
    • 一维差分
    • 二维差分

高精度

高精度加法

image-20220730162041560

791
给定两个正整数(不含前导 0),计算它们的和。输入格式
共两行,每行包含一个整数。输出格式
共一行,包含所求的和。数据范围
1≤整数长度≤100000
输入样例:
12
23
输出样例:
35
#include <iostream>
#include <vector>
using namespace std;
// C = A + B
vector<int> add(vector<int> &A,vector<int> &B)  // 引用:提升效率,不加引用需要拷贝
{vector<int> C;int t = 0;  //上一次进位,最终用t来存储最终结果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];//t表示该位上的总的结构,结果vector中需要插入的是模10后的余数C.push_back(t%10);t /= 10; //用于下一次累加}if(t) C.push_back(t);return C;}int main()
{string a,b; //用字符串读 123456vector<int> A,B,C;  //存储到vector容器中去cin>>a>>b;//逆序for(int i = a.size()-1;i>=0;i--) A.push_back(a[i]-'0'); // A 654321 for(int i = b.size()-1;i>=0;i--) B.push_back(b[i]-'0');C = add(A,B);//倒着输出,先输出最高位,再输出次高位for(int i =C.size()-1;i>=0;i--) printf("%d",C[i]);return 0;
}

高精度减法

image-20220730163203860image-20220730163319188

792
给定两个正整数(不含前导 0),计算它们的差,计算结果可能为负数。输入格式
共两行,每行包含一个整数。输出格式
共一行,包含所求的差。数据范围
1≤整数长度≤105
输入样例:
32
11
输出样例:
21
#include <iostream>
#include <vector>
using namespace std;
//判断是否A>=B
bool cmp(vector<int> &A,vector<int> &B)
{//首先判断位数 判断大小只要不等直接返回A.size()>B.size()if(A.size()!= B.size()) return A.size()>B.size();// i--时,第二个判断条件为>=,i++时,第二个条件可以为 <for(int i = A.size()-1;i>=0;i--)if(A[i]!=B[i])//判断大小只要不等直接返回A.size()>B.size()return A[i]>B[i];return true;
}
vector<int> sub(vector<int> &A,vector<int> &B)
{vector<int> C;for(int t = 0,i = 0;i < A.size();i++){//t 上次运算的借位t = A[i] - t;if(i < B.size()) t -=B[i];// t>=0 -- t  t<0 ---t+10C.push_back((t+10)%10);if(t < 0) t = 1;else t = 0;}//清空前置0,如果本身是0,不进行前导0 即C.size()>1while(C.size()>1 && C.back() == 0) C.pop_back();return C;
}int main()
{string a,b;vector<int> A,B,C;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)){C = sub(A,B);}else{C = sub(B,A);printf("-");}for(int i =C.size()-1;i>=0;i--) printf("%d",C[i]);return 0;
}

高精度乘法

image-20220730164424097

793
给定两个非负整数(不含前导 0) A 和 B,请你计算 A×B 的值。输入格式
共两行,第一行包含整数 A,第二行包含整数 B。输出格式
共一行,包含 A×B 的值。数据范围
1≤A的长度≤100000,
0≤B≤10000
输入样例:
2
3
输出样例:
6
#include <iostream>
#include <vector>
using namespace std;//C = A * b
vector<int> mul(vector<int> &A,int b)
{vector<int> C;int t = 0; //进位//需要判断两种情况 A的位数没有处理完  或者  进位没有处理完for(int i = 0;i<A.size()||t;i++){if(i<A.size()) t += A[i]*b;//插入模10后的余数C.push_back(t%10);t/=10;}while(C.size() > 1&& C.back() == 0) C.pop_back();return C;
}/*
如果将for循环两个条件拆开,可以采用这种写法,但和在一块写效果更好
vector<int > mul(vector<int > &a,int &b)
{int t = 0;for(int i = 0;i < a.size();i++){t += a[i]*b;c.push_back(t%10);t /=10;}while(t) {c.push_back(t%10);t /= 10;}while(c.size() > 1 && c.back() == 0) c.pop_back();return c;
}*/int main()
{string a;vector<int> A;int b;cin>>a>>b;for(int i = a.size()-1;i>=0;i--){A.push_back(a[i]-'0');}// for(int i =A.size()-1;i>=0;i--) printf("%d",A[i]);auto c = mul(A,b);for(int i =c.size()-1;i>=0;i--) printf("%d",c[i]);return 0;
}

高精度除法

举例

image-20220730170549738

image-20220730170711931

794
给定两个非负整数(不含前导 0) A,B,请你计算 A/B 的商和余数。输入格式
共两行,第一行包含整数 A,第二行包含整数 B。输出格式
共两行,第一行输出所求的商,第二行输出所求余数。数据范围
1≤A的长度≤100000,
1≤B≤10000,
B 一定不为 0
输入样例:
7
2
输出样例:
3
1
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;//A/b 商是C,余数是r,r通过引用传递
vector<int> div(vector<int> &A,int b,int &r)
{vector<int> C;r = 0;  //r代表上一次的余数//除法从最高位开始看;注意i++还是i--for(int i = A.size()-1;i>=0;i--){//r * 10 把r整体向高位移动一位,将最后一位空出来r = r * 10 + A[i];//从头开始除,r/b不会是两位数C.push_back(r / b);r %= b;}//C中最低位存的是最高位,最高位存的是最低位reverse(C.begin(),C.end());//前导0while(C.size() > 1 && C.back()==0) C.pop_back();return C;}int main()
{string a;vector<int> A;int b;cin>>a>>b;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--) printf("%d",c[i]);cout<<endl<<r<<endl;return 0;
}

理解

代码背的不是字母,背的是思路


前缀和

一维前缀和

image-20220730173656402

image-20220730190218532

S0= 0

作用:快速求出原数组中一段的和

注意1:此处为Sr - Sl-1

image-20220730190328106

image-20220730190328150

image-20220730190357124

**注意2: 下标从1开始:**定义S0 = 0

好处:主要是处理边界,统一处理所有情况;不需要进行特判

image-20220730190512438

输入一个长度为 n 的整数序列。接下来再输入 m 个询问,每个询问输入一对 l,r。对于每个询问,输出原序列中从第 l 个数到第 r 个数的和。输入格式
第一行包含两个整数 n 和 m。第二行包含 n 个整数,表示整数数列。接下来 m 行,每行包含两个整数 l 和 r,表示一个询问的区间范围。输出格式
共 m 行,每行输出一个询问的结果。数据范围
1≤l≤r≤n,
1≤n,m≤100000,
−1000≤数列中元素的值≤1000
输入样例:
5 3
2 1 3 6 4
1 2
1 3
2 4
输出样例:
3
6
10
#include <iostream>
using namespace std;
//统一表示数组长度,避免每次定义数组声明长度
const int N = 100010;
int n,m;
int a[N],s[N];
int main()
{scanf("%d%d",&n,&m);//对于数组输入来说,用for比用while更加方便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;scanf("%d%d",&l,&r);printf("%d\n",s[r]-s[l-1]);  //区间和的计算}return 0;
}

二维前缀和–求子矩阵中一部分和

求Sij–四部分矩形组合:拆出来aij==>Si-1,j Si,j-1 Si-1,j-1

image-20220731091125396

求子矩形的面积–四部分矩形组合

Sx2y2

X不变:X2,Y变:Y1-1

Y不变: Y2,X变:X1-1

Sx1-1,y2 Sx2,y1-1

Sx1-1,y1-1

image-20220730192505748

image-20220730192642667

具体分析

image-20220731095902001

//796
输入一个 n 行 m 列的整数矩阵,再输入 q 个询问,每个询问包含四个整数 x1,y1,x2,y2,表示一个子矩阵的左上角坐标和右下角坐标。对于每个询问输出子矩阵中所有数的和。输入格式
第一行包含三个整数 n,m,q。接下来 n 行,每行包含 m 个整数,表示整数矩阵。接下来 q 行,每行包含四个整数 x1,y1,x2,y2,表示一组询问。输出格式
共 q 行,每行输出一个询问的结果。数据范围
1≤n,m≤1000,
1≤q≤200000,
1≤x1≤x2≤n,
1≤y1≤y2≤m,
−1000≤矩阵内元素的值≤1000
输入样例:
3 4 3
1 7 2 4
3 6 2 8
2 1 2 3
1 1 2 2
2 1 3 4
1 3 3 4
输出样例:
17
27
21
#include <iostream>const int N =1010;
int n,m,q;
int a[N][N],s[N][N];
int main()
{scanf("%d%d%d",&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;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);printf("%d\n",s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]);  //算子矩阵的部分和}return 0;
}

差分

一维差分

差分是前缀和的逆运算

image-20220731100459364

好处:对某个区间的数据加和减小了时间复杂度

image-20220731100731868

image-20220731100939744

image-20220731101041413

image-20220731101418307

差分:

a[N],b[N]全部初始化为0,b[N]不需要单独构造,只需要在a[N]基础上进行增值的操作即可,即不存在构造函数

输入一个长度为 n 的整数序列。接下来输入 m 个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r] 之间的每个数加上 c。请你输出进行完所有操作后的序列。输入格式
第一行包含两个整数 n 和 m。第二行包含 n 个整数,表示整数序列。接下来 m 行,每行包含三个整数 l,r,c,表示一个操作。输出格式
共一行,包含 n 个整数,表示最终序列。数据范围
1≤n,m≤100000,
1≤l≤r≤n,
−1000≤c≤1000,
−1000≤整数序列中元素的值≤1000
输入样例:
6 3
1 2 2 1 2 1
1 3 1
3 5 1
1 6 1
输出样例:
3 4 5 3 4 2
#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()
{scanf("%d%d",&n,&m);for(int i = 1;i<=n;i++) scanf("%d",&a[i]);for(int i = 1;i<=n;i++ ) insert(i,i,a[i]);while(m--){int l,r,c;scanf("%d%d%d",&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++) printf("%d ",b[i]);return 0;    
}

二维差分

差分都不考虑人工构造,只考虑如何更新

image-20220731104324734

输入一个 n 行 m 列的整数矩阵,再输入 q 个操作,每个操作包含五个整数 x1,y1,x2,y2,c,其中 (x1,y1) 和 (x2,y2) 表示一个子矩阵的左上角坐标和右下角坐标。每个操作都要将选中的子矩阵中的每个元素的值加上 c。请你将进行完所有操作后的矩阵输出。输入格式
第一行包含整数 n,m,q。接下来 n 行,每行包含 m 个整数,表示整数矩阵。接下来 q 行,每行包含 5 个整数 x1,y1,x2,y2,c,表示一个操作。输出格式
共 n 行,每行 m 个整数,表示所有操作进行完毕后的最终矩阵。数据范围
1≤n,m≤1000,
1≤q≤100000,
1≤x1≤x2≤n,
1≤y1≤y2≤m,
−1000≤c≤1000,
−1000≤矩阵内元素的值≤1000
输入样例:
3 4 3
1 2 2 1
3 2 2 1
1 1 1 1
1 1 2 2 1
1 3 2 3 2
3 1 3 4 1
输出样例:
2 3 4 1
4 3 4 1
2 2 2 2
#include <iostream>using namespace std;const int N = 1010;
int a[N][N], b[N][N];
int n,m,q;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()
{scanf("%d%d%d",&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++ )insert(i,j,i,j,a[i][j]);while(q--){int x1,y1,x2,y2,c;//输入数据不要弄错顺序//结果与预期不同,先检查输入有没有错误scanf("%d%d%d%d%d",&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++)printf("%d ",b[i][j]);printf("\n");}return 0;}

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

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

相关文章

第一章 基础算法(三)

文章目录双指针算法双指针算法分类双指针算法模板性质&#xff1a;总结例1例2位运算二进制的第k位lowbit 返回x的最后一位1实现计算机中编码知识做题思路离散化区间合并双指针算法 双指针算法分类 双指针算法模板 性质&#xff1a; 总结 为什么双指针算法可以起到优化的作用&a…

第二章 数据结构(二)

文章目录Trie树存储并查集常规例题并查集维护多余信息堆性质存储基础操作downup操作例题Trie树 Tire&#xff1a;高效地存储和查找字符串集合的数据结构 存储 如果没有就创建。 对单词结尾进行标记&#xff0c;表示以当前节点结尾的地方存在一个单词 维护一个字符串集合&am…

Apache Camel 3只有2个月的路程

骆驼队正忙于为 Apache Camel3 。今天&#xff0c;第二个候选版本已构建并发布在暂存库中&#xff0c;供早期的适配器尝试 。 当我自己很忙的时候&#xff0c;我只想写一篇简短的博客文章&#xff0c;以使社区了解Apache Camel 3即将发布&#xff0c;我们希望它在今年年底&am…

第二章 数据结构(三)

文章目录哈希表存储结构拉链法&#xff1a;插入查询题目注意开放寻址法查找质数代码字符串哈希方式STL相关知识哈希表存储结构 整体结构 0~109->0~105 方法&#xff1a; x mod 105处理冲突 开放寻址法拉链法 拉链法&#xff1a; 思想&#xff1a;每个槽上拉一条链&…

Vaadin 10+作为CUBA UI的未来

从一开始&#xff0c;Vaadin就成为CUBA平台用户界面的基石和重要组成部分。 由于其创新的方法&#xff0c;它帮助CUBA将企业用户界面开发带到了一个非常有希望的&#xff08;如今是默认&#xff09;的WEB领域。 Vaadin最令人兴奋的部分之一是整个开发都是同构的&#xff0c;并且…

第二章 数据结构(一)

文章目录整体结构为什么用数组链表与邻接表单链表存储插入插入至头结点将x插入到下标为k的点后面删除遍历双链表初始化插入删除邻接表栈和队列栈队列单调栈单调队列KMP整体结构 链表与邻接表&#xff08;用数组模拟&#xff09;栈与队列&#xff08;用数组模拟&#xff09;kmp…

第三章搜索与图论(一)

文章目录DFS与BFS区别DFS全排列n皇后BFS树和图的遍历树和图的存储数和图的遍历深度优先遍历宽度优先遍历图的宽搜应用框架DFS与BFS区别 DFS: 执着&#xff1a;一直走到头&#xff0c;回去的时候边回去边看能不能向下走 BFS: 稳重&#xff1a;每次只扩展一层&#xff0c;不会…

第三章 搜索与图论(二)

文章目录最短路朴素Dijkstra算法堆优化版的Dijkstra算法Bellman-Ford算法SPFA算法求距离判负环Floyd最短路 并不区分有向图和无向图&#xff0c;因为无向图是一种特殊的有向图。直接用有向图的算法&#xff0c;解决无向图的问题。 常见情况可以分为两大类 在图论中&#xff0…

第三章 搜索与图论(三)

文章目录朴素版PrimKruskal算法染色法匈牙利算法朴素版Prim 给定一个 n 个点 m 条边的无向图&#xff0c;图中可能存在重边和自环&#xff0c;边权可能为负数。求最小生成树的树边权重之和&#xff0c;如果最小生成树不存在则输出 impossible。给定一张边带权的无向图 G(V,E)&a…

CDF 图的含义

CDF 图用于创建经验累积分布函数图。 使用 CDF 图可以确定等于或小于 x 轴上的给定值的数据的百分比。 例如&#xff0c;在该 CDF 图中&#xff0c;大约 34% 的数据小于总脂肪值 10 克。 参考链接 1. https://www.jmp.com/support/help/zh/14-2/ba-distribution-22.shtml

rome rss_RSS阅读器使用:ROME,Spring MVC,嵌入式Jetty

rome rss在这篇文章中&#xff0c;我将展示一些创建Spring Web应用程序的指南&#xff0c;这些应用程序使用Jetty并使用名为ROME的外部库运行RSS来运行它。 一般 我最近创建了一个示例Web应用程序&#xff0c;充当RSS阅读器。 我想检查ROME以阅读RSS。 我还想使用Spring容器和…

Ubuntu系统输入中文方式

我目前知道Ubuntu有两个还算好用的中文输入法&#xff1a; Fcitx&#xff1a;它是Linux世界开源的输入法框架&#xff0c;提供 Google PinYin、ShuangPin、SunPinYin、Wubi、ZhengMa、Hong Kong 和 TaiWan繁体等输入法。 1 安装Fcitx sudo apt install fcitx-pinyin fcit…

VMWare建立于W10的共享文件夹

一、共享文件夹建立 在虚拟机设置 -> 文件夹共享&#xff0c;选择总是启用&#xff0c;点击添加&#xff1a; 直接点击下一步&#xff1a; 选择原系统共享文件夹位置&#xff0c;并命名&#xff1a; 选择启用此共享&#xff0c;并继续&#xff1a; 二、VMtools安装 虚拟机…

VSCode如何去掉Monokai主题下的绿色下划线

VScode中类似sublime的主题为Monokai&#xff0c;但是自带主题Monokai中绿色下划线令人不舒服。 在网上寻找多种方式去除下划线。终于找到一种合适的处理方式。 1 安装主题插件 在主题插件中搜索One Monokai Theme&#xff0c;下载并安装 2 配置全局主题 通过快捷键“Ctr…

解决 ZLibrary 登录/注册不了的问题

一 文章转载链接内容 转载链接&#xff1a;解决 ZLibrary 登录/注册不了的问题 - 知乎 很多小伙伴反馈说 Z-Library 能打开&#xff0c;但是不能登录。这实际上是由于官方登录入口受限导致的。话虽如此&#xff0c;我们仍然可以通过某些方法绕过这个限制。 >虽然我们注册时…

gradle入门_Gradle入门:简介

gradle入门Gradle是一种构建工具&#xff0c;可以用基于Groovy编程语言的内部DSL替换基于XML的构建脚本。 最近它吸引了很多关注&#xff0c;这就是为什么我决定仔细研究一下。 这篇博客文章是我的Gradle教程的第一部分&#xff0c;它有两个目标&#xff1a; 帮助我们安装Gr…

排队论游乐场的游乐项目_外汇游乐场

排队论游乐场的游乐项目介绍 F X Playground是基于JavaFX的原型制作工具或实时编辑器&#xff0c;它消除了编译Java代码的步骤。 这个概念并不新鲜&#xff0c;例如在网络世界中&#xff0c;有许多HTML5 游乐场提供在线编辑器&#xff0c;使开发人员可以快速原型化或尝试各种Ja…

Node.js安装及环境配置之Windows篇

原博文链接&#xff1a;Node.js安装及环境配置之Windows篇 - 刘奇云 - 博客园 from:https://www.cnblogs.com/zhouyu2017/p/6485265.html 一、安装环境 1、本机系统&#xff1a;Windows 10 Pro&#xff08;64位&#xff09; 2、Node.js&#xff1a;v6.9.2LTS&#xff08;64位…

npm WARN logfile could not create logs-dir: Error: EPERM: operation not permitted, mkdir ‘地址

场景&#xff1a;在windows系统下&#xff0c;安装node之后&#xff0c;查看npm版本&#xff0c;报错如图所示&#xff1a; 原因&#xff1a;是node目录权限不够&#xff1b; 解决方法&#xff1a;找到node目录&#xff0c;右键属性 > 安全 > 设置users用户完全控制权限…

javafx 自定义控件_JavaFX技巧10:自定义复合控件

javafx 自定义控件用JavaFX编写自定义控件是一个简单直接的过程。 需要一个控件类来控制控件的状态&#xff08;因此命名&#xff09;。 外观需要控件的外观。 而且通常不是用于自定义外观CSS文件。 控件的一种常见方法是将其正在使用的节点隐藏在其外观类中。 例如&#xff0…