
算法
lqd️
毕业前成为大牛
展开
-
数论-----------高斯消元
输入一个包含n个方程n个未知数的线性方程组。方程组中的系数为实数。求解这个方程组。下图为一个包含m个方程n个未知数的线性方程组示例:输入格式第一行包含整数n。接下来n行,每行包含n+1个实数,表示一个方程的n个系数以及等号右侧的常数。输出格式如果给定线性方程组存在唯一解,则输出共n行,其中第i行输出第i个未知数的解,结果保留两位小数。如果给定线性方程组存在无数解,则输出“Infinite group solutions”。如果给定线性方程组无解,则输出“No solution”。数.原创 2021-02-22 11:17:44 · 492 阅读 · 1 评论 -
算法基础 (14)区间合并
给定 n 个区间 [li,ri],要求合并所有有交集的区间。注意如果在端点处相交,也算有交集。输出合并完成后的区间个数。例如:[1,3]和[2,6]可以合并为一个区间[1,6]。输入格式第一行包含整数n。接下来n行,每行包含两个整数 l 和 r。输出格式共一行,包含一个整数,表示合并区间完成后的区间个数。数据范围1 ≤ n ≤ 100000,−10^9 ≤ li ≤ ri ≤ 10^9输入样例:51 22 45 67 87 9输出样例:3区间合并算法分析将.原创 2021-01-23 15:58:58 · 427 阅读 · 0 评论 -
算法基础 (13)离散化
假定有一个无限长的数轴,数轴上每个坐标上的数都是0。现在,我们首先进行 n 次操作,每次操作将某一位置x上的数加c。接下来,进行 m 次询问,每个询问包含两个整数l和r,你需要求出在区间[l, r]之间的所有数的和。输入格式第一行包含两个整数n和m。接下来 n 行,每行包含两个整数x和c。再接下里 m 行,每行包含两个整数l和r。输出格式共m行,每行输出一个询问中所求的区间内数字和。数据范围−109 ≤ x ≤ 10^9,1 ≤ n, m ≤ 10^5,−10^9 ≤ l ≤ r .原创 2021-01-23 15:49:16 · 366 阅读 · 0 评论 -
算法基础 (12)位运算
给定一个长度为n的数列,请你求出数列中每个数的二进制表示中1的个数。输入格式第一行包含整数n。第二行包含n个整数,表示整个数列。输出格式共一行,包含n个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中1的个数。数据范围1 ≤ n ≤ 100000,0 ≤ 数列中元素的值 ≤ 10^9输入样例:51 2 3 4 5输出样例:1 1 2 1 2位运算的lowbit操作适用场景:求出某个数二进制第k位是几先把第k位移到最后一位(n >> k).原创 2021-01-23 15:12:20 · 202 阅读 · 1 评论 -
算法基础 (11)双指针
给定一个长度为n的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。输入格式第一行包含整数n。第二行包含n个整数(均在0~100000范围内),表示整数序列。输出格式共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。数据范围1 ≤ n ≤ 100000输入样例:51 2 2 3 5输出样例3双指针算法分析首先说一下双指针算法的应用场景如果找到i和’j’是单调关系,那么就可以用双指针算法对于一个序列,用两个指针维护一段区间对于两个序列,维护某种.原创 2021-01-23 13:47:23 · 181 阅读 · 0 评论 -
算法基础 (10)差分
输入一个长度为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输.原创 2021-01-23 13:03:29 · 274 阅读 · 0 评论 -
算法基础 (9)前缀和
输入一个长度为n的整数序列。接下来再输入m个询问,每个询问输入一对l, r。对于每个询问,输出原序列中从第l个数到第r个数的和。输入格式第一行包含两个整数n和m。第二行包含n个整数,表示整数数列。接下来m行,每行包含两个整数l和r,表示一个询问的区间范围。输出格式共m行,每行输出一个询问的结果。数据范围1 ≤ l ≤ r ≤n,1 ≤ n,m ≤ 100000,−1000 ≤ 数列中元素的值 ≤ 1000输入样例:5 32 1 3 6 41 21 32 4输出样例:.原创 2021-01-22 15:05:00 · 226 阅读 · 0 评论 -
算法基础 (8)高精度除法
给定两个非负整数A,B,请你计算 A / B的商和余数。输入格式共两行,第一行包含整数A,第二行包含整数B。输出格式共两行,第一行输出所求的商,第二行输出所求余数。数据范围1 ≤ A的长度 ≤ 100000,1 ≤ B ≤ 10000B 一定不为0输入样例:72输出样例:31高精度除法算法分析同样采取逆序存储(具体原因见高精度加法)模拟除法规则,从高位到底位与除数进行相除,除得的余数放入t中,则此位的数为t / 10.把剩余的t % 10给下一个底位若遍历完整个A,.原创 2021-01-22 14:38:58 · 643 阅读 · 3 评论 -
算法基础 (7)高精度乘法
给定两个正整数A和B,请你计算A * B的值。输入格式共两行,第一行包含整数A,第二行包含整数B。输出格式共一行,包含A * B的值。数据范围1 ≤ A的长度 ≤ 100000,0 ≤ B ≤ 10000输入样例:23输出样例:6高精度乘法算法分析同高精度加法与减法相同,都采用逆序存储。因为B的数据范围是10^5以内所以可以用A的每一位去乘b模拟乘法规则,从A的个位到高位与B相乘,乘得的结果放入t中,则此位的数为t % 10.把t / 10剩余给下一个高位若遍历完整个.原创 2021-01-22 14:06:02 · 361 阅读 · 0 评论 -
算法基础 (6)高精度减法
给定两个正整数,计算它们的差,计算结果可能为负数。输入格式共两行,每行包含一个整数。输出格式共一行,包含所求的差。数据范围1 ≤ 整数长度 ≤ 10^5输入样例:3211输出样例:21高精度减法算法分析同高精度加法一样,进行减法运算同样需要逆序存储,从前往后比从后往前好算在进行减法运算之前先比较两个数的大小,遵循大数减小数模拟减法规则,从个位到高位进行相减,若个位不够减则向上一个高位借1sub(A,B)函数中,C = A - B, 若A >= B 则求A - B,.原创 2021-01-22 13:48:17 · 472 阅读 · 0 评论 -
算法基础 (5) 高精度加法
给定两个正整数,计算它们的和。输入格式共两行,每行包含一个整数。输出格式共一行,包含所求的和。数据范围1 ≤ 整数长度 ≤ 100000输入样例:1223输出样例:35高精度加法算法分析首先要将输入的字符串逆序存入List中,因为从前往后好算,进位只需要在最后一位加上1,如果是按照小学列竖式进行计算那么就要在第一位之前加上1,这样操作十分麻烦,所以就逆序存储进行加法运算在进行加法运算时遍历list集合每次取出一位进行加法运算,t为进位,A[i] + B[i] + t就是后一.原创 2021-01-22 13:16:27 · 1140 阅读 · 0 评论 -
算法基础 (4) 浮点数二分
给定一个浮点数n,求它的三次方根。输入格式:共一行,包含一个浮点数n。输出格式:共一行,包含一个浮点数,表示问题的解。注意,结果保留6位小数。数据范围:−10000 ≤ n ≤ 10000输入样例:1000.00输出样例:10.000000浮点数二分主要思想浮点数二分没有整数二分那么复杂,由边界条件的判断唯一注意的就是如果数据范围是10^5那么在循环时候应该是r - l > 1e-7如果数据范围是10^7那么循环时应是r - l > 1e-9这样精度保证不会出错.原创 2021-01-22 11:49:53 · 310 阅读 · 1 评论 -
算法基础 (3) 整数二分
给定一个按照升序排列的长度为n的整数数组,以及 q 个查询。对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。如果数组中不存在该元素,则返回“-1 -1”。输入格式:第一行包含整数n和q,表示数组长度和询问个数。第二行包含n个整数(均在1~10000范围内),表示完整数组。接下来q行,每行包含一个整数k,表示一个询问元素。输出格式:共q行,每行包含两个整数,表示所求元素的起始位置和终止位置。如果数组中不存在该元素,则返回“-1 -1”。数据范围:1 ≤ n ≤ 1.原创 2021-01-22 11:38:33 · 146 阅读 · 0 评论 -
算法基础 (2) 归并排序
归并排序主要思想是分治每次取中间点mid = l + r >> 1递归排序从0到mid和mid + 1到r归并操作的时候首先用两个指针分别指向左右两个数组中的最小值比较谁更小,更小的放在答案数组的第一位放入的指针往后走,在继续比较直至某数组到头,另一数组的剩余部分直接接入答案数组时间复杂度: O(nlogn)import java.util.Scanner;public class MergeSort { public static void main(Stri原创 2021-01-21 11:35:08 · 156 阅读 · 1 评论 -
算法基础 (1) 快速排序
快速排序算法可以分为三个步骤:确定分界点:q [ l ] 或 q [ r ] 或 q [ ( l + r ) / 2 ]调整区间:保证x左边是 <= x的, 右边是 >= x的递归处理左右两段import java.util.Scanner;public class Main { static int[] q; public static void main(String[] args) { Scanner sc = new Scanner(Sys原创 2021-01-18 11:04:51 · 124 阅读 · 3 评论