
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 · 397 阅读 · 0 评论 -
AcWing 5. 多重背包问题 II
有 N 种物品和一个容量是 V 的背包。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。输出格式输出一个整数,表示最大价值。数据范围0<N≤10000<V≤20000<vi,wi,si≤200原创 2020-10-13 22:37:05 · 328 阅读 · 0 评论 -
AcWing 4.多重背包问题 I
1小时12分原创 2020-10-09 22:12:36 · 744 阅读 · 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 · 247 阅读 · 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 · 281 阅读 · 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 · 221 阅读 · 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输入样例:5I 1I 2I 3Q 2Q原创 2020-08-12 21:28:00 · 209 阅读 · 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 · 252 阅读 · 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 · 203 阅读 · 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输入样例:5I abcQ abcQ abI原创 2020-08-02 15:52:18 · 143 阅读 · 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 · 322 阅读 · 0 评论 -
AcWing 830. 单调栈
给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出-1。输入格式第一行包含整数N,表示数列长度。第二行包含N个整数,表示整数数列。输出格式共一行,包含N个整数,其中第i个数表示第i个数的左边第一个比它小的数,如果不存在则输出-1。数据范围1≤N≤1051≤数列中元素≤109输入样例:53 4 2 7 5输出样例:-1 3 -1 2 2#include <iostream>#include <stack>using names原创 2020-07-28 22:35:06 · 478 阅读 · 0 评论 -
AcWing 801. 二进制中1的个数
给定一个长度为n的数列,请你求出数列中每个数的二进制表示中1的个数。输入格式第一行包含整数n。第二行包含n个整数,表示整个数列。输出格式共一行,包含n个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中1的个数。数据范围1≤n≤100000,0≤数列中元素的值≤109输入样例:51 2 3 4 5输出样例:1 1 2 1 2神奇的lowbit函数#include <iostream>using namespace std;int lowbit(i原创 2020-07-22 22:14:24 · 158 阅读 · 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 61 2 4 73 4 6 8 9输出样例:原创 2020-07-22 21:47:01 · 201 阅读 · 0 评论 -
AcWing 799. 最长连续不重复子序列
给定一个长度为n的整数序列,请找出最长的不包含重复数字的连续区间,输出它的长度。输入格式第一行包含整数n。第二行包含n个整数(均在0~100000范围内),表示整数序列。输出格式共一行,包含一个整数,表示最长的不包含重复数字的连续子序列的长度。数据范围1≤n≤100000输入样例:51 2 2 3 5输出样例:3双指针+滑动窗口#include <iostream>#include <unordered_map>using namespace std原创 2020-07-22 21:44:04 · 250 阅读 · 0 评论 -
AcWing 830. 单调栈
给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出-1。输入格式第一行包含整数N,表示数列长度。第二行包含N个整数,表示整数数列。输出格式共一行,包含N个整数,其中第i个数表示第i个数的左边第一个比它小的数,如果不存在则输出-1。数据范围1≤N≤1051≤数列中元素≤109输入样例:53 4 2 7 5输出样例:-1 3 -1 2 2#include <iostream>#include <stack>using names原创 2020-07-12 16:11:44 · 153 阅读 · 0 评论 -
AcWing 794. 高精度除法
给定两个非负整数A,B,请你计算 A / B的商和余数。输入格式共两行,第一行包含整数A,第二行包含整数B。输出格式共两行,第一行输出所求的商,第二行输出所求余数。数据范围1≤A的长度≤100000,1≤B≤10000B 一定不为0输入样例:72输出样例:31#include <iostream>#include <vector>#include <string>#include <algorithm>using nam原创 2020-07-08 21:02:09 · 242 阅读 · 0 评论 -
AcWing 793. 高精度乘法
给定两个正整数A和B,请你计算A * B的值。输入格式共两行,第一行包含整数A,第二行包含整数B。输出格式共一行,包含A * B的值。数据范围1≤A的长度≤100000,0≤B≤10000输入样例:23输出样例:6#include <iostream>#include <string>#include <vector>using namespace std;void multi(const vector<int>&原创 2020-07-08 20:49:25 · 255 阅读 · 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 · 160 阅读 · 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 · 207 阅读 · 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#include <iostream>using namespace std;const int N = 1e6 + 10;in原创 2020-07-05 23:32:26 · 160 阅读 · 0 评论