Awing算法基础课
采用c++语言
疯狂java杰尼龟
路漫漫其修远兮,吾将上下而求索
展开
-
Acwing 830. 单调栈
给定一个长度为 N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。输入格式第一行包含整数 N,表示数列长度。第二行包含N 个整数,表示整数数列。输出格式共一行,包含 N 个整数,其中第i个数表示第 i 个数的左边第一个比它小的数,如果不存在则输出 −1。数据范围1≤N≤1051≤数列中元素≤109输入样例:53 4 2 7 5输出样例:-1 3 -1 2 2思路用单调递增栈,当该元素可以入栈的时候,栈顶元素就是它左侧第一个比它小的元素。#pragma w原创 2021-08-29 23:14:50 · 122 阅读 · 0 评论 -
Acwing 827. 双链表
实现一个双链表,双链表初始为空,支持 5 种操作:在最左侧插入一个数;在最右侧插入一个数;将第 k个插入的数删除;在第k个插入的数左侧插入一个数;在第 k个插入的数右侧插入一个数现在要对该链表进行 M次操作,进行完所有操作后,从左到右输出整个链表。注意:题目中第k 个插入的数并不是指当前链表的第k个数。例如操作过程中一共插入了n个数,则按照插入的时间顺序,这n个数依次为:第 1 个插入的数,第 2 个插入的数,…第 n 个插入的数。输入格式第一行包含整数 M,表示操作次数。`接下来 M原创 2021-08-29 22:58:00 · 202 阅读 · 5 评论 -
Acwing 826. 单链表
实现一个单链表,链表初始为空,支持三种操作:向链表头插入一个数;删除第k 个插入的数后面的数;在第 k个插入的数后插入一个数。现在要对该链表进行M次操作,进行完所有操作后,从头到尾输出整个链表。注意:题目中第k个插入的数并不是指当前链表的第k个数。例如操作过程中一共插入了n 个数,则按照插入的时间顺序,这n个数依次为:第 1 个插入的数,第 2 个插入的数,…第n 个插入的数。输入格式第一行包含整数M,表示操作次数。接下来 M行,每行包含一个操作命令,操作命令可能为以下几种:H x,表示向原创 2021-08-26 17:35:24 · 202 阅读 · 0 评论 -
Acwing 803. 区间合并
给定 n 个区间[li,ri],要求合并所有有交集的区间。注意如果在端点处相交,也算有交集。输出合并完成后的区间个数。例如:[1,3] 和 [2,6] 可以合并为一个区间 [1,6]。输入格式第一行包含整数 n。接下来n行,每行包含两个整数 l和r。输出格式共一行,包含一个整数,表示合并区间完成后的区间个数。数据范围1≤n≤100000,−109≤li≤ri≤109输入样例:51 22 45 67 87 9输出样例:3思路使用一个pair来存储下标对,遍历所有区原创 2021-08-26 17:28:30 · 187 阅读 · 0 评论 -
Acwing 802. 区间和
假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。现在,我们首先进行 n次操作,每次操作将某一位置 x上的数加 c。接下来,进行 m 次询问,每个询问包含两个整数l和r,你需要求出在区间[l,r]之间的所有数的和。输入格式第一行包含两个整数n和m。接下来n行,每行包含两个整数 x 和c。再接下来 m行,每行包含两个整数 l和 r。输出格式共 m 行,每行输出一个询问中所求的区间内数字和。数据范围−10e9≤x≤10e9,1≤n,m≤105,−10e9≤l≤r≤10e9,−100原创 2021-08-26 17:12:50 · 281 阅读 · 0 评论 -
Acwing 799. 最长连续不重复子序列
给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。输入格式第一行包含整数 n。第二行包含 n个整数(均在 0∼105 范围内),表示整数序列。输出格式共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。数据范围1≤n≤105输入样例:51 2 2 3 5输出样例:3思路使用双指针方法i指针用来遍历序列使用一个数组来记录重复数,遇到重复的则将j指针右移#include <iostream>using name原创 2021-08-26 16:43:20 · 198 阅读 · 0 评论 -
Acwing 794. 高精度除法
给定两个非负整数 A,B,请你计算 A/B 的商和余数。输入格式共两行,第一行包含整数 A,第二行包含整数 B。输出格式共两行,第一行输出所求的商,第二行输出所求余数。数据范围1≤A的长度≤100000,1≤B≤10000,B 一定不为 0输入样例:72输出样例:31思路A2A1A0 b_______每次除数r = r*10 + A[i]原创 2021-08-22 23:49:40 · 148 阅读 · 0 评论 -
Acwing 793. 高精度乘法
给定两个整数 A 和 B,请你计算 A×B 的值。输入格式共两行,第一行包含整数 A,第二行包含整数 B。输出格式共一行,包含 A×B 的值。数据范围1≤A的长度≤100000,0≤B≤10000输入样例:23输出样例:6思路A2A1A0B1B0————以个位为例,每一位的结果为A0*B0 %10进位为A0*B0 / 10#include <iostream>#include <vector>using namespace std;原创 2021-08-22 23:41:23 · 124 阅读 · 0 评论 -
Acwing 792. 高精度减法
给定两个正整数,计算它们的差,计算结果可能为负数。输入格式共两行,每行包含一个整数。输出格式共一行,包含所求的差。数据范围1≤整数长度≤105输入样例:3211输出样例:21思路A2A1A0 B1B0————Ai - Bi有两种情况t>=0 ,则取tt<0 ,则取t + 10(借一位加10),比如3-9 + 10 = 4采用(t+10)%10即可囊括这两种情况每次运算A[i] - B[i]原创 2021-08-22 23:35:09 · 139 阅读 · 0 评论 -
Acwing 791. 高精度加法
给定两个正整数,计算它们的和。输入格式共两行,每行包含一个整数。输出格式共一行,包含所求的和。数据范围1≤整数长度≤100000输入样例:1223输出样例:35思路A2 A1 A0+ B1 B0—————例如个位上的结果为(A0+B0)%10实际运算结果为Ai + Bi + t,其中t为上一位的进位#include <iostream>#include <vector>using namespace s原创 2021-08-22 23:12:41 · 132 阅读 · 0 评论 -
Acwing 790. 数的三次方根
给定一个浮点数n,求它的三次方根。输入格式共一行,包含一个浮点数 n。输出格式共一行,包含一个浮点数,表示问题的解。注意,结果保留 6 位小数。数据范围−10000≤n≤10000输入样例:1000.00输出样例:10.000000思路在区间中找到一个接近的值#include <iostream>using namespace std;int main() { double x; cin >> x;////输入浮点数 double l =原创 2021-08-22 23:01:11 · 258 阅读 · 0 评论 -
Acwing 788. 逆序对的数量
给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量。逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i<j 且 a[i]>a[j],则其为一个逆序对;否则不是。输入格式第一行包含整数 n,表示数列的长度。第二行包含 n 个整数,表示整个数列。输出格式输出一个整数,表示逆序对的个数。数据范围1≤ n ≤100000,数列中的元素的取值范围 [1,109]。输入样例:62 3 4 5 6 1输出样例:5思路要求逆序对的数量分三种情况,其中原创 2021-08-22 19:33:41 · 181 阅读 · 0 评论 -
Acwing 786. 第k个数
给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。输入格式第一行包含两个整数 n 和 k。第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整数数列。输出格式输出一个整数,表示数列的第 k 小数。数据范围1≤n≤100000,1≤k≤n输入样例:5 32 4 1 5 3输出样例:3思路|—————x—————|设小于等于x的数的个数:SL,大于等于x的数的个数为SR分两种情况① k<=SL,此时原创 2021-08-22 16:53:55 · 160 阅读 · 0 评论 -
Acwing 3811. 排列
请你构造一个长度为 n 的数组 a1,a2,…,an。要求:该数组是一个 1∼n 的排列。对于所有 1≤i≤n,满足 ai≠i。输入格式第一行包含整数 T,表示共有 T 组测试数据。每组数据占一行,包含一个整数 n。输出格式每组数据输出一行结果,包含 n 个空格隔开的整数 a1,a2,…,an。如果方案不唯一,输出任意合理方案均可。保证一定有解。数据范围本题共两个测试点。小测试点,如样例所示。大测试点满足:1≤T≤100,2≤n≤100。输入样例:225输出样例:2原创 2021-08-22 16:27:18 · 165 阅读 · 0 评论 -
AcWing 787. 归并排序
学习过程:6月30日 算法原理 代码尝试写到运行成功一遍 另敲写两遍算法步骤第一步,确定分界点,mid = (left+right)/2;第二步,递归排序左右两个部分第三步,归并,合二为一时间复杂度为O(nlogn)代码模板#pragma warning(disable:4996) #include <iostream>using namespace std;const int N = 1000010;int q[N], temp[N];int n;voi原创 2021-07-01 14:20:04 · 222 阅读 · 0 评论 -
AcWing 785. 快速排序
学习过程:6月27日解算法步骤,然后执行一遍,代码找着写一遍6月28日代码敲写两遍。快速排序-分治算法步骤算法执行过程代码模板算法步骤第一步:确定分界点第二步:调整区间|————|————|确定中间的x,将数组调整为左边小右边大方法一:使用两个额外的数组a[],b[],分别存储比x小的部分和比x大的部分,再将a,b数组组织到一个数组中方法二:使用两个指针来处理,常规也是这样去做第三步:递归处理左右两段算法执行过程手写的,看不懂来找我==代码模板c++代码#i原创 2021-06-30 19:35:31 · 123 阅读 · 0 评论