![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ACWing基础算法
leimingzeOuO
已退役
展开
-
【C++】最短Hamilton路径
91. 最短Hamilton路径给定一张 n 个点的带权无向图,点从 0∼n−1 标号,求起点 0 到终点 n−1 的最短 Hamilton 路径。Hamilton 路径的定义是从 0 到 n−1 不重不漏地经过每个点恰好一次。输入格式第一行输入整数 n。接下来 n 行每行 n 个整数,其中第 i 行第 j 个整数表示点 i 到 j 的距离(记为 a[i,j])。对于任意的 x,y,z,数据保证 a[x,x]=0,a[x,y]=a[y,x] 并且 a[x,y]+a[y,z]≥a[x,z]。输出原创 2021-10-13 22:37:46 · 680 阅读 · 0 评论 -
算法基础课第二章(数据结构)
单链表 —— 模板题 AcWing 826. 单链表// head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点int head, e[N], ne[N], idx;// 初始化void init(){ head = -1; idx = 0;}// 在链表头插入一个数avoid insert(int a){ e[idx] = a, ne[idx] = head, head = idx ++ ;}// 将头结点删转载 2021-09-20 18:16:13 · 132 阅读 · 0 评论 -
【c++】240.食物链(分层并查集)
240. 食物链动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形。A 吃 B,B 吃 C,C 吃 A。现有 N 个动物,以 1∼N 编号。每个动物都是 A,B,C 中的一种,但是我们并不知道它到底是哪一种。有人用两种说法对这 N 个动物所构成的食物链关系进行描述:第一种说法是 1 X Y,表示 X 和 Y 是同类。第二种说法是 2 X Y,表示 X 吃 Y。此人对 N 个动物,用上述两种说法,一句接一句地说出 K 句话,这 K 句话有的是真的,有的是假的。当一句话满足下原创 2021-09-20 14:43:33 · 237 阅读 · 0 评论 -
【c++/java】Nim游戏(博弈论证明)
891.Nim游戏给定 n 堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。问如果两人都采用最优策略,先手是否必胜。输入格式第一行包含整数 n。第二行包含 n 个数字,其中第 i 个数字表示第 i 堆石子的数量。输出格式如果先手方必胜,则输出 Yes。否则,输出 No。数据范围1≤n≤105,1≤每堆石子数≤109输入样例:22 3输出样例:Yes本题思路公平组合游戏:若一个游戏满足:由原创 2021-09-18 13:21:35 · 942 阅读 · 0 评论 -
计数dp,整数划分
900. 整数划分一个正整数 n 可以表示成若干个正整数之和,形如:n=n1+n2+…+nk,其中 n1≥n2≥…≥nk,k≥1。我们将这样的一种表示称为正整数 n 的一种划分。现在给定一个正整数 n,请你求出 n 共有多少种不同的划分方法。输入格式共一行,包含一个整数 n。输出格式共一行,包含一个整数,表示总划分数量。由于答案可能很大,输出结果请对 109+7 取模。数据范围1≤n≤1000输入样例:5输出样例:7#include <bits/stdc++.h>原创 2021-07-24 21:51:34 · 123 阅读 · 0 评论 -
2021-07-21
AcWing 896. 最长上升子序列 II#include <bits/stdc++.h>using namespace std;int main(){ int n; cin>>n; vector<int>arr(n); for(int i=0;i<n;i++) cin>>arr[i]; vector<int>stk; stk.push_back(arr[0]);原创 2021-07-21 20:45:56 · 86 阅读 · 0 评论 -
2021-07-18
AcWing 873. 欧拉函数给定 n 个正整数 ai,请你求出每个数的欧拉函数。欧拉函数的定义1∼N 中与 N 互质的数的个数被称为欧拉函数,记为 ϕ(N)。若在算数基本定理中,N=pa11pa22…pamm,则:ϕ(N) = N×p1−1p1×p2−1p2×…×pm−1pm输入格式第一行包含整数 n。接下来 n 行,每行包含一个正整数 ai。输出格式输出共 n 行,每行输出一个正整数 ai 的欧拉函数。数据范围1≤n≤100,1≤ai≤2×109输入样例:3368原创 2021-07-18 19:28:55 · 488 阅读 · 0 评论 -
背包小结.
01背包//二维for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++) f[i][j]=f[i-1][j]; if(j>=v[i])f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);}//一维for(int i=1;i<=n;i++) for(int j=m;j>=v[i];j--) f[j]=max(f[j],f[j-v[i]]+w[i]);原创 2021-07-17 10:36:22 · 87 阅读 · 0 评论 -
2021-07-15
4. 多重背包问题 I有 N 种物品和一个容量是 V 的背包。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。输出格式输出一个整数,表示最大价值。数据范围0<N,V≤1000<vi,wi,si≤10原创 2021-07-15 21:45:23 · 78 阅读 · 0 评论 -
2021-07-14
2. 01背包问题有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。输出格式输出一个整数,表示最大价值。数据范围0<N,V≤10000<vi,wi≤1000输入样例原创 2021-07-14 22:14:35 · 152 阅读 · 0 评论 -
2021-07-12
866. 试除法判定质数链接: 题目链接.给定 n 个正整数 ai,判定每个数是否是质数。输入格式第一行包含整数 n。接下来 n 行,每行包含一个正整数 ai。输出格式共 n 行,其中第 i 行输出第 i 个正整数 ai 是否为质数,是则输出 Yes,否则输出 No。数据范围1≤n≤100,1≤ai≤231−1输入样例:226输出样例:YesNo#include <bits/stdc++.h>using namespace std;int n;bool原创 2021-07-12 20:44:48 · 245 阅读 · 0 评论 -
2021-07-11笔记
排列数字链接: 题目链接.给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。现在,请你按照字典序将所有的排列方法输出。输入格式共一行,包含一个整数 n。输出格式按字典序输出所有排列方案,每个方案占一行。数据范围1≤n≤7输入样例:3输出样例:1 2 31 3 22 1 32 3 13 1 23 2 1#include <bits/stdc++.h>using namespace std;const int N=10;int path[N原创 2021-07-09 23:02:08 · 199 阅读 · 0 评论 -
堆排序(小顶堆)
原题链接 :838.堆排序输入一个长度为 n 的整数数列,从小到大输出前 m 小的数。输入格式第一行包含整数 n 和 m。第二行包含 n 个整数,表示整数数列。输出格式共一行,包含 m 个整数,表示整数数列中前 m 小的数。数据范围1≤m≤n≤105,1≤数列中元素≤109输入样例:5 34 5 1 3 2输出样例:1 2 3主要思路–by yxc#include <bits/stdc++.h>using namespace std;const int N原创 2021-07-04 23:26:18 · 394 阅读 · 2 评论 -
一维差分.
#include <bits/stdc++.h>using namespace std;const int N=100010;int a[N],b[N];int main(){ int n,m; cin>>n>>m; for(int i=1;i<=n;i++) { cin>>a[i]; b[i]=a[i]-a[i-1]; } int l,r,c; whi..原创 2021-06-08 01:49:36 · 84 阅读 · 0 评论 -
Trie(字典树)
835. Trie字符串统计参考 用数组来模拟Trie树的具体分析.维护一个字符串集合,支持两种操作:I x 向集合中插入一个字符串 x;Q x 询问一个字符串在集合中出现了多少次。共有 N 个操作,输入的字符串总长度不超过 105,字符串仅包含小写英文字母。输入格式第一行包含整数 N,表示操作数。接下来 N 行,每行包含一个操作指令,指令为 I x 或 Q x 中的一种。输出格式对于每个询问指令 Q x,都要输出一个整数作为结果,表示 x 在集合中出现的次数。每个结果占一行。数原创 2021-05-30 20:49:45 · 91 阅读 · 0 评论 -
《并查集》
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 在同一集合内原创 2021-05-27 19:26:37 · 115 阅读 · 0 评论 -
数组模拟双链表
题目链接: AcWing 827. 双链表 .代码参考链接: 点击这里.实现一个双链表,双链表初始为空,支持 5 种操作:在最左侧插入一个数;在最右侧插入一个数;将第 k 个插入的数删除;在第 k 个插入的数左侧插入一个数;在第 k 个插入的数右侧插入一个数现在要对该链表进行 M 次操作,进行完所有操作后,从左到右输出整个链表。注意:题目中第 k 个插入的数并不是指当前链表的第 k 个数。例如操作过程中一共插入了 n 个数,则按照插入的时间顺序,这 n 个数依次为:第 1 个插入的数,第原创 2021-05-23 19:29:02 · 317 阅读 · 0 评论 -
前缀和与差分
视频讲解: STUACM-算法入门-前缀和与差分(含二维).参考文章链接: 前缀和与差分 图文并茂 超级详细整理(全网最通俗易懂).题目链接: 一维前缀和.输入一个长度为 n 的整数序列。接下来再输入 m 个询问,每个询问输入一对 l,r。对于每个询问,输出原序列中从第 l 个数到第 r 个数的和。输入格式第一行包含两个整数 n 和 m。第二行包含 n 个整数,表示整数数列。接下来 m 行,每行包含两个整数 l 和 r,表示一个询问的区间范围。输出格式共 m 行,每行输出一个询问的结原创 2021-05-23 01:41:17 · 181 阅读 · 0 评论 -
高精度乘法
高精度×低精度参考yxc#include <bits/stdc++.h>using namespace std;vector<int>mul(vector<int>&A,int b){ vector<int>C; int t=0; for(int i=0;i<A.size()||t;i++) { if(i<A.size())t+=A[i]*b; C.push_back转载 2021-05-20 00:37:59 · 109 阅读 · 0 评论 -
模拟加法减法
高精度加法原题链接: 点击这里.给定两个正整数,计算它们的和。输入格式共两行,每行包含一个整数。输出格式共一行,包含所求的和。数据范围1≤整数长度≤100000输入样例:1223输出样例:35#include <bits/stdc++.h>using namespace std;vector<int>sum(vector<int>&a,vector<int>&b){ vector<int>原创 2021-05-18 23:23:45 · 340 阅读 · 0 评论 -
二分法的两种模板
视频讲解点击这里.y总牛逼板子1是找整型右端点,板子2是找整型左端点。这里板子1的l+r+1>>1上取整(解决了 l=r-1的时候 mid=(l+r)/2=l r不变,死循环了).简单记法:如果l=mid,则上取整,否则下取整.AcWing 模板题:题目链接 点击这里.给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。如果数组中不存在该元素,则返回 -1 -1。输入格式第一行包原创 2021-05-17 15:24:57 · 254 阅读 · 0 评论 -
逆序对个数(归并排序)
题目链接: 点击进入.#include <bits/stdc++.h>using namespace std;const int N=100010;int arr[N],tmp[N];void merge_sort(int q[],int l,int r){ if(l>=r)return; int mid=l+r>>1; merge_sort(q,l,mid),merge_sort(q,mid+1,r); int k=0,i=l,j=原创 2021-05-16 19:51:07 · 318 阅读 · 0 评论