![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ACM
夏木_湫
帅
展开
-
递归实现指数型枚举
题目从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。输入格式输入一个整数n。输出格式每行输出一种方案。同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。对于没有选任何数的方案,输出空行。本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。数据范围1≤n≤15解析题目该题目就是要求{1,2,…,n}中所有的真子集代码及其解析# include <bits/stdc++.h>using namespace std;int n;原创 2021-06-13 19:11:46 · 58 阅读 · 0 评论 -
KMP算法通俗易懂的解释
KMP算法KMP解释S[N] 为被匹配的串, P[M] 为模板串简单来说KMP算法就是先预处理P[M]模板串预处理的结果用next[N]数组表示next[i] = j; 的含义为:p[1,…,j] = p[i - j + 1,…,i]可以看成一个从右到左的一个单链表这样的话,每次P与S匹配失败了,不用再从P头开始遍历,而是跳到P[j] 处就行题目求出模板串P在模式串S中所有出现位置的起始下标代码/* 求出模板串P在模式串S中所有出现位置的起始下标*/#include &l原创 2021-03-16 17:05:56 · 315 阅读 · 0 评论 -
线性DP_最长上升子序列
文章目录题目题目原创 2020-11-21 17:21:07 · 91 阅读 · 0 评论 -
线性DP_数字三角形
线性DP数字三角形代码详解原创 2020-11-18 21:03:58 · 89 阅读 · 0 评论 -
动态规划DP_01背包详解_介绍
这里写目录标题01背包简介DP 思想例题题解代码优化优化后的代码01背包简介有N个物体,第i件物体的体积为v[i], 价值为w[i]有一个容量为V的背包每件物品最多用一次, 求装的物品价值最大是多少DP 思想状态表示为 f(i, j) :该含义为取前i个物品, 但总体积 <= j我们可以对该状态进行划分,划分为两种情况,一种是包含i, 另一种不包含i | | ----不包含i : 也就是从1 ~ i - 1 的物品中选: 该状态为 f(i - 1, j)f(i, j)原创 2020-11-13 21:34:17 · 259 阅读 · 0 评论 -
差分-详解
差分简介原数组a[1], a[2], a[3], a[4], ..., a[n]构造b[1], b[2], b[3], b[4], ..., b[n]使得a[i] = b[1] + b[2] + ... + b[i]把a数组中 区间为 [l, r]中每个数据都加 C 用暴力需要O(n)用差分只需要O(1)只需要 b[l] + C , b[r + 1] - C其实反过来说 a数组为b数组的前缀和代码#include <iostream>using name原创 2020-07-23 00:27:04 · 346 阅读 · 0 评论 -
前缀和-详解
前缀和简介a[] = {a1, a2, a3, ..., an }前缀和:下标要从1开始s[i] = a[1] + a[2] + ... + a[i]作用求 求区间 [l, r] 之间的;数据之和 = s[r] - s[l - 1]for (int i = 1; i <= n; i ++) s[i] = s[i - 1] + a[i]s[0]要为0,为了处理边界题目输入格式:第一行先输入 m, n接下来输入m的数据n为查询次数每次输入两个整数 l r输出格式:原创 2020-07-23 00:05:23 · 944 阅读 · 1 评论 -
离散化-算法运算-模板
适用条件适用于值域比较大 -1e9 <= x <= 1e9但是个数比较少 n <= 1e5离散化的作用机理d[]: 1 3 100 1500映射 | | | | 0 1 2 3出现的问题一/ d[] 中可能有重复元素二/ 如何算出x 离散化后对应的值是多少针对原创 2020-07-22 22:14:39 · 190 阅读 · 0 评论 -
位运算-详解
位运算概况n的二进制表示中第k位是0还是1n = 15 = (1111)①先把第k位移到最后一位 n >> k;②与1进行与运算 n&1这样就可以知道 n二进制位 第k位是几lowbit(x)lowbit(x) 是返回最后以为1是多少eg:x = (1010) ; lowbit(x) == (10)x = (101000) ; lowbit(x) == (1000)代码int lowbit (int x){ return x原创 2020-07-22 21:19:07 · 136 阅读 · 0 评论 -
高精度除法
步骤一 存储数据二 运算题目求 A /b#include <iostream>#include <vector>#include <algorithm>using namespace std;// A / b ,商是 C,余数 rvector<int> div(vector<int> &A,int b, int &r){ vector<int> C; r = 0; fo原创 2020-07-15 02:28:51 · 154 阅读 · 0 评论 -
高精度乘法
步骤一 存储过程与之前无异二 模拟计算A[3] A[2] A[1] A[0]* b------------------------C[3] c[2] C[1] C[0]C[i] = A[I] * b + t题目求A*bA为大整数,b为<=1000的整数#include <iostream>#include <vector>using namespace std;vector<int> mul (vect原创 2020-07-15 01:47:42 · 126 阅读 · 0 评论 -
高精度减法
步骤① 大整数存储 与之前高精度加法的 存储过程一样②进行模拟运算A[3] A[2] A[1] A[0]- B[2] B[1] B[0]----------------------- C[2] C[1] C[0] 首先保证A > BA[I] - B[I] - t ① >= 0 直接减 ② < 0 A[i] - B[i] - t + 10t为上一位的借位值题目大整数减法 求 A - B#include <iostr原创 2020-07-15 01:23:26 · 169 阅读 · 0 评论 -
高精度加法
步骤①存储大整数例 有一个大整数 123456789把其存入数组 倒着存储a[0] = 9;a[1] = 8;a[2] = 7;…;a[8] = 1;②运算,模拟人工加法 A[3] A[2] A[1] A[0] + B[2] B[1] B[0] -------------------------- C[3] C[2] C[1] C[0]C[I] = A[I] + B[I] +T//T为上一位的进位题目用高精度算 A +B 的结果input119原创 2020-07-14 18:53:48 · 146 阅读 · 0 评论 -
二分-整数二分
前言有单调性一定可以二分能二分的不一定有单调性二分介绍把整个数据段分为两部分①寻左边界的值1.取中间值坐标 mid = (l + r + 1) / 22.判断if(q[mid] 在左边部分中) l = midelse r = mid - 1②取右边界值1.取中间值坐标 mid = (l + r) / 22.判断if (q[mid] 在右边部分中) r = midelse l = mid + 1题目给定一个按照升序排列的长度为n的整数数组,以及 q 个查询。对于每个查询,返回原创 2020-07-14 13:22:08 · 164 阅读 · 0 评论 -
归并排序_初步
归并排序步骤① 确定分界点min = (l+r)/2②递归左右两边③归并,把两个有序数组合并题目给定你一个长度为n的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数 n。第二行包含 n 个整数(所有整数均在1~109范围内),表示整个数列。输出格式输出共一行,包含 n 个整数,表示排好序的数列。数据范围1≤n≤100000输入样例:53 1 2 4 5输出样例:1 2 3 4 5#inc原创 2020-07-14 02:03:06 · 130 阅读 · 0 评论 -
快速排序
快速排序步骤①确定分界点 XX可以取{1.q[l] 最左值2.q[r] 最右值3.q[(r+l)/2] 中间点4.随机一个点}② 划分区间分为两段让<=X 的在左边让>=X 的在右边划分区间的方法①1.新开两个数组 a[] b[]2.遍历q[] <=X的数值 q[i]->a[] >= X的数值 q[i]->b[]3.a[]->q[] b[]->q[] 方法②用二个指针i ,ji 先往原创 2020-07-14 01:56:32 · 161 阅读 · 0 评论