AcWing算法基础
Bryan要加油
这个作者很懒,什么都没留下…
展开
-
AcWing 9. 分组背包问题
有 N 组物品和一个容量是 V 的背包。 每组物品有若干个,同一组内的物品最多只能选一个。 每件物品的体积是 vij,价值是 wij,其中 i 是组号,j 是组内编号。 求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 第一行有两个整数 N,V,用空格隔开,分别表示物品组数和背包容量。 接下来有 N 组数据: 每组数据第一行有一个整数 Si,表示第 i 个物品组的物品数量; 每组数据接下来有 Si 行,每行有两个整数 vij,wij,用空格隔开,分别表示第 i原创 2020-10-14 22:27:22 · 350 阅读 · 0 评论 -
AcWing 5. 多重背包问题 II
有 N 种物品和一个容量是 V 的背包。 第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。 输出最大价值。 输入格式 第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。 接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。 输出格式 输出一个整数,表示最大价值。 数据范围 0<N≤1000 0<V≤2000 0<vi,wi,si≤200原创 2020-10-13 22:37:05 · 287 阅读 · 0 评论 -
AcWing 4.多重背包问题 I
1小时12分原创 2020-10-09 22:12:36 · 699 阅读 · 0 评论 -
AcWing 3.完全背包问题
问题描述 问题解析 朴素做法 #include <iostream> using namespace std; const int N = 1010; int n; int m; int v[N]; int w[N]; int f[N][N]; int main() { cin >> n >> m; for(int i = 1;i<=n;++i) cin >> v[i] >> w[i];原创 2020-06-26 16:31:15 · 224 阅读 · 0 评论 -
AcWing 2.01背包问题
问题描述 问题解析 朴素做法 #include <iostream> #include <algorithm> using namespace std; const int N = 1010; int n; int m; int v[N]; int w[N]; int f[N][N]; int main(void) { cin >> n >> m; for(int i = 1;i<=n;++i) {原创 2020-06-26 15:41:51 · 236 阅读 · 0 评论 -
AcWing 841. 字符串哈希
给定一个长度为n的字符串,再给定m个询问,每个询问包含四个整数l1,r1,l2,r2,请你判断[l1,r1]和[l2,r2]这两个区间所包含的字符串子串是否完全相同。 字符串中只包含大小写英文字母和数字。 输入格式 第一行包含整数n和m,表示字符串长度和询问次数。 第二行包含一个长度为n的字符串,字符串中只包含大小写英文字母和数字。 接下来m行,每行包含四个整数l1,r1,l2,r2,表示一次询问所涉及的两个区间。 注意,字符串的位置从1开始编号。 输出格式 对于每个询问输出一个结果,如果两个字符串子串完全原创 2020-08-12 22:19:56 · 204 阅读 · 0 评论 -
AcWing 840. 模拟散列表
维护一个集合,支持如下几种操作: “I x”,插入一个数x; “Q x”,询问数x是否在集合中出现过; 现在要进行N次操作,对于每个询问操作输出对应的结果。 输入格式 第一行包含整数N,表示操作数量。 接下来N行,每行包含一个操作指令,操作指令为”I x”,”Q x”中的一种。 输出格式 对于每个询问指令“Q x”,输出一个询问结果,如果x在集合中出现过,则输出“Yes”,否则输出“No”。 每个结果占一行。 数据范围 1≤N≤105 −109≤x≤109 输入样例: 5 I 1 I 2 I 3 Q 2 Q原创 2020-08-12 21:28:00 · 183 阅读 · 0 评论 -
AcWing 837. 连通块中点的数量--并查集,维护集合元素个数
给定一个包含n个点(编号为1~n)的无向图,初始时图中没有边。 现在要进行m个操作,操作共有三种: “C a b”,在点a和点b之间连一条边,a和b可能相等; “Q1 a b”,询问点a和点b是否在同一个连通块中,a和b可能相等; “Q2 a”,询问点a所在连通块中点的数量; 输入格式 第一行输入整数n和m。 接下来m行,每行包含一个操作指令,指令为“C a b”,“Q1 a b”或“Q2 a”中的一种。 输出格式 对于每个询问指令”Q1 a b”,如果a和b在同一个连通块中,则输出“Yes”,否则输出“N原创 2020-08-10 22:19:01 · 228 阅读 · 0 评论 -
AcWing 836. 合并集合--并查集
一共有n个数,编号是1~n,最开始每个数各自在一个集合中。 现在要进行m个操作,操作共有两种: “M a b”,将编号为a和b的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作; “Q a b”,询问编号为a和b的两个数是否在同一个集合中; 输入格式 第一行输入整数n和m。 接下来m行,每行包含一个操作指令,指令为“M a b”或“Q a b”中的一种。 输出格式 对于每个询问指令”Q a b”,都要输出一个结果,如果a和b在同一集合内,则输出“Yes”,否则输出“No”。 每个结果占一行原创 2020-08-10 22:17:55 · 159 阅读 · 0 评论 -
AcWing 835. Trie字符串统计
维护一个字符串集合,支持两种操作: “I x”向集合中插入一个字符串x; “Q x”询问一个字符串在集合中出现了多少次。 共有N个操作,输入的字符串总长度不超过 10^5,字符串仅包含小写英文字母。 输入格式 第一行包含整数N,表示操作数。 接下来N行,每行包含一个操作指令,指令为”I x”或”Q x”中的一种。 输出格式 对于每个询问指令”Q x”,都要输出一个整数作为结果,表示x在集合中出现的次数。 每个结果占一行。 数据范围 1≤N≤2∗10^4 输入样例: 5 I abc Q abc Q ab I原创 2020-08-02 15:52:18 · 117 阅读 · 0 评论 -
AcWing 154. 滑动窗口(单调队列)
给定一个大小为n≤10^6的数组。 有一个大小为k的滑动窗口,它从数组的最左边移动到最右边。 您只能在窗口中看到k个数字。 每次滑动窗口向右移动一个位置。 以下是一个例子: 该数组为[1 3 -1 -3 5 3 6 7],k为3。 您的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。 输入格式 输入包含两行。 第一行包含两个整数n和k,分别代表数组长度和滑动窗口的长度。 第二行有n个整数,代表数组的具体数值。 同行数据之间用空格隔开。 输出格式 输出包含两个。 第一行输出,从左至右,每个位置滑动原创 2020-07-28 22:36:56 · 278 阅读 · 0 评论 -
AcWing 830. 单调栈
给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出-1。 输入格式 第一行包含整数N,表示数列长度。 第二行包含N个整数,表示整数数列。 输出格式 共一行,包含N个整数,其中第i个数表示第i个数的左边第一个比它小的数,如果不存在则输出-1。 数据范围 1≤N≤105 1≤数列中元素≤109 输入样例: 5 3 4 2 7 5 输出样例: -1 3 -1 2 2 #include <iostream> #include <stack> using names原创 2020-07-28 22:35:06 · 464 阅读 · 0 评论 -
AcWing 801. 二进制中1的个数
给定一个长度为n的数列,请你求出数列中每个数的二进制表示中1的个数。 输入格式 第一行包含整数n。 第二行包含n个整数,表示整个数列。 输出格式 共一行,包含n个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中1的个数。 数据范围 1≤n≤100000, 0≤数列中元素的值≤109 输入样例: 5 1 2 3 4 5 输出样例: 1 1 2 1 2 神奇的lowbit函数 #include <iostream> using namespace std; int lowbit(i原创 2020-07-22 22:14:24 · 122 阅读 · 0 评论 -
AcWing 800. 数组元素的目标和
给定两个升序排序的有序数组A和B,以及一个目标值x。数组下标从0开始。 请你求出满足A[i] + B[j] = x的数对(i, j)。 数据保证有唯一解。 输入格式 第一行包含三个整数n,m,x,分别表示A的长度,B的长度以及目标值x。 第二行包含n个整数,表示数组A。 第三行包含m个整数,表示数组B。 输出格式 共一行,包含两个整数 i 和 j。 数据范围 数组长度不超过100000。 同一数组内元素各不相同。 1≤数组元素≤109 输入样例: 4 5 6 1 2 4 7 3 4 6 8 9 输出样例:原创 2020-07-22 21:47:01 · 164 阅读 · 0 评论 -
AcWing 799. 最长连续不重复子序列
给定一个长度为n的整数序列,请找出最长的不包含重复数字的连续区间,输出它的长度。 输入格式 第一行包含整数n。 第二行包含n个整数(均在0~100000范围内),表示整数序列。 输出格式 共一行,包含一个整数,表示最长的不包含重复数字的连续子序列的长度。 数据范围 1≤n≤100000 输入样例: 5 1 2 2 3 5 输出样例: 3 双指针+滑动窗口 #include <iostream> #include <unordered_map> using namespace std原创 2020-07-22 21:44:04 · 210 阅读 · 0 评论 -
AcWing 830. 单调栈
给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出-1。 输入格式 第一行包含整数N,表示数列长度。 第二行包含N个整数,表示整数数列。 输出格式 共一行,包含N个整数,其中第i个数表示第i个数的左边第一个比它小的数,如果不存在则输出-1。 数据范围 1≤N≤105 1≤数列中元素≤109 输入样例: 5 3 4 2 7 5 输出样例: -1 3 -1 2 2 #include <iostream> #include <stack> using names原创 2020-07-12 16:11:44 · 126 阅读 · 0 评论 -
AcWing 794. 高精度除法
给定两个非负整数A,B,请你计算 A / B的商和余数。 输入格式 共两行,第一行包含整数A,第二行包含整数B。 输出格式 共两行,第一行输出所求的商,第二行输出所求余数。 数据范围 1≤A的长度≤100000, 1≤B≤10000 B 一定不为0 输入样例: 7 2 输出样例: 3 1 #include <iostream> #include <vector> #include <string> #include <algorithm> using nam原创 2020-07-08 21:02:09 · 203 阅读 · 0 评论 -
AcWing 793. 高精度乘法
给定两个正整数A和B,请你计算A * B的值。 输入格式 共两行,第一行包含整数A,第二行包含整数B。 输出格式 共一行,包含A * B的值。 数据范围 1≤A的长度≤100000, 0≤B≤10000 输入样例: 2 3 输出样例: 6 #include <iostream> #include <string> #include <vector> using namespace std; void multi(const vector<int>&原创 2020-07-08 20:49:25 · 231 阅读 · 0 评论 -
AcWing 792. 高精度减法
#include <iostream> #include <vector> using namespace std; void sub(const vector<int> &a_vec,const vector<int> &b_vec,vector<int> &c_vec) { int tmp = 0; //tmp用于存储借位和临时计算结果 for(int i = 0;i<a_vec.siz原创 2020-07-08 20:44:30 · 136 阅读 · 0 评论 -
AcWing 791. 高精度加法
#include <iostream> #include <vector> using namespace std; void add(const vector<int> &a_vec,const vector<int> &b_vec,vector<int> &c_vec) { if(b_vec.size() > a_vec.size()) { add(b_vec,a_vec原创 2020-07-07 23:37:01 · 188 阅读 · 0 评论 -
AcWing 786. 第k个数
给定一个长度为n的整数数列,以及一个整数k,请用快速选择算法求出数列的第k小的数是多少。 输入格式 第一行包含两个整数 n 和 k。 第二行包含 n 个整数(所有整数均在1~109范围内),表示整数数列。 输出格式 输出一个整数,表示数列的第k小数。 数据范围 1≤n≤100000, 1≤k≤n 输入样例: 5 3 2 4 1 5 3 输出样例: 3 #include <iostream> using namespace std; const int N = 1e6 + 10; in原创 2020-07-05 23:32:26 · 133 阅读 · 0 评论