算法题解
文章平均质量分 67
算法题解
cutlery1137
这个作者很懒,什么都没留下…
展开
-
考研机试题 -- 排序、进位制、日期
枚举a会超时,枚举m不会。原创 2023-04-01 06:45:02 · 464 阅读 · 0 评论 -
洛谷P1087 FBI树【二叉树遍历】
题目链接:P1087 FBI树程序说明:后序遍历+判断条件,注意indexOf()可以判断子串是否存在(一开始没想到用indexOf)代码如下:import java.util.*;import java.io.*;public class Main { public static void main(String[] args) { String s = new String(); int n; Scanner in = new Sca原创 2020-11-12 12:48:49 · 329 阅读 · 1 评论 -
洛谷P1734 最大约数和【01背包】
题目链接:P1734 最大约数和代码如下:#include <iostream>using namespace std;const int N = 1010;int n, v[N], f[N][N], w[N];int main() { cin>>n; //预处理每个数的约数和 for(int i = 1; i <= n; i++) for(int j = 1; j < i; j++) if原创 2020-11-07 15:29:58 · 196 阅读 · 0 评论 -
洛谷P1516 青蛙的约会【扩展欧几里得算法】
题目链接:程序说明:问题转化为求解线性同余方程:x + k * m ≡ y + k * n (mod L)方程等价于:x + k * m = z * L + y + k * n合并同类项,化简后得:k * (n − m) + z * L = x - y (将负号化为正号方便处理)设 a = n - m,b = L,c = x - y,即求线性方程:a * k + b * z = c 的解,扩展欧几里得求出整数解k,再扩大 c / gcd(a,b)倍即为方程的通解。需要注意的地方有两点:n - m原创 2020-11-07 12:45:15 · 290 阅读 · 0 评论 -
洛谷P1194 买礼物【最小生成树】
题目链接:P1194 买礼物程序说明:优惠大于0时建边,跑一边kruskal求最小生成树即可。需要注意的地方是,有可能优惠后的价格比原价还高。。因此需要加一个判断条件。代码如下:#include <iostream>#include <algorithm>using namespace std;const int M = 510;struct Edge { int a, b, w; bool operator < (const Edge &a)原创 2020-11-05 13:12:27 · 289 阅读 · 0 评论 -
洛谷P1403 [AHOI2005]约数研究【数论】
题目链接:P1403 [AHOI2005]约数研究程序说明:[1,n]的所有整数中p的倍数的个数:⌊\lfloor⌊np\frac{n}{p}pn⌋\rfloor⌋代码如下:#include <iostream>using namespace std;int n, res;int main() { cin>>n; for(int i = 1; i <= n; i++) ans += n / i; cout<<res原创 2020-11-04 21:18:14 · 304 阅读 · 0 评论 -
洛谷P2071 座位安排【二分图最大匹配】
题目链接:P2071 座位安排程序说明:可以把右边的一列座位放在左边一列的后面,第 i 排左边的编号为 i ,右边的编号为 i + n。二分图的最大匹配可以用匈牙利算法求解。注意每个点连四条边,数组要开四倍大小。代码如下:#include <iostream>#include <cstring>using namespace std;const int N = 10100, M = 2 * N;int h[N], e[M], ne[M], idx, res;in原创 2020-11-04 15:30:51 · 260 阅读 · 0 评论 -
洛谷P1330 封锁阳光大学【二分图】
题目链接:P1330 封锁阳光大学程序说明:题意为判断无向图是否为二分图,可以用dfs染色。-1表示没访问过,0和1表示将顶点染成两种不同的颜色,如果一条边相邻的两个顶点被染成了相同的颜色,则可以判断出不是二分图。如果是二分图,需要记录1和0的个数,较小者即为答案。代码如下:#include <iostream>#include <cstring>using namespace std;const int N = 10010, M = 100010;int h[N原创 2020-11-03 21:59:17 · 173 阅读 · 0 评论 -
洛谷P1195 口袋的天空【最小生成树】
题目链接:P1195 口袋的天空程序说明:最小生成树的裸题,代码如下:#include <iostream>#include <algorithm>using namespace std;const int N = 1010, M = 10010;int n, m, k, p[N];struct Edge { int a, b, w; bool operator < (const Edge &W) const { return w <原创 2020-11-03 16:36:12 · 219 阅读 · 0 评论 -
洛谷P1144 最短路计数【最短路】
题目链接:P1144 最短路计数程序说明:如果搜索到的点到起点的距离等于当前点到起点的距离加上这两点间的那条边的距离,那么我们就将搜索到的点的路径数加上当前点的路径数。如果我们更新了搜索到的点到起点的最短距离,那么我们将到达改点的路径数改为当前点的路径数。(参考P1608 路径统计 题解)因此将spfa的松弛操作修改为://cnt[]记录路径数if(dist[j] > dist[t] + 1) { dist[j] = dist[t] + 1; cnt[j] = cnt[t]; }原创 2020-11-03 11:30:48 · 217 阅读 · 0 评论 -
洛谷P1396 营救【最小生成树】【最短路】
题目链接:P1396 营救程序说明:法一:kruskal求最小生成树,当s和t连通时,此时边的权值w就是题中要求的最小的最大值(因为边是从小到大排序的)。法二:spfa求最短路。分析可知要让每段路的权值都尽可能小,所得到的路径不一定是从s到t的最短路,但是可以利用最短路的模板来解决:取两条边权值的较大者,如果比第三条边小,则更新。只需将spfa中的松弛操作:if(dist[j] > dist[t] + w[i]) dist[j] = dist[t] + w[i];改为:int t原创 2020-11-02 16:40:49 · 519 阅读 · 0 评论 -
洛谷P1226 【模板】快速幂||取余运算
题目链接:P1226 【模板】快速幂||取余运算程序说明:注意开long long。res最后还要再模一次k,因为指数有可能等于0。代码如下:#include <iostream>#include <cstdio>using namespace std;typedef long long LL;LL fun(LL b, LL p, LL k) { LL res = 1; while(p) { if(p & 1) res =原创 2020-11-01 23:35:52 · 137 阅读 · 0 评论 -
洛谷P1629 邮递员送信【最短路】
题目链接:P1629 邮递员送信程序说明:注意每次只能拿一件物品,送到目的地后必须返回起点才能送下一件。因此可以将题目转化为:从1号点到其余各点的最短路,再加上其余各点到1号点的最短路即为正确答案。求多个点到1号点的最短路,可以将邻接矩阵坐标互换(即将有向图反转)。代码如下:#include <iostream>#include <cstring>using namespace std;const int N = 1010, M = 100010;int g[N原创 2020-11-01 21:54:30 · 479 阅读 · 0 评论 -
洛谷P1525 关押罪犯【并查集】【二分图】
题目链接:P1525 关押罪犯程序说明:贪心思想,想要将怨气值最小化,就要优先处理怨气值大的两个顶点,将他们分别放在不同的集合。enemy数组记录敌人,每次把与自己敌对的人放进一个集合。代码如下:#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const int N = 20010, M = 100010;//enemy[i]表示i的敌人 int原创 2020-11-01 15:35:40 · 240 阅读 · 0 评论 -
AcWing 845. 八数码【BFS】
题目链接:845. 八数码 在一个3×3的网格中,1~8这8个数字和一个“x”恰好不重不漏地分布在这3×3的网格中。例如:1 2 3x 4 67 5 8在游戏过程中,可以把“x”与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):1 2 34 5 67 8 x例如,示例中图形就可以通过让“x”先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下:1 2 3 1 2 3 1 2 3 1 2 3原创 2020-11-01 11:09:40 · 147 阅读 · 0 评论 -
洛谷P1536 村村通【并查集】
题目链接:P1536 村村通程序说明:n个集合需要用n - 1条线连接起来,因此合并完集合后,循环遍历所有点,记录集合的总数,减一则为正确答案代码如下:#include <iostream>using namespace std;const int N = 1010;int p[N], n, m;int find(int x) { if(p[x] != x) p[x] = find(p[x]); return p[x];}int main() {原创 2020-11-01 10:10:22 · 323 阅读 · 0 评论 -
洛谷P1145 约瑟夫
题目链接:P1145 约瑟夫程序说明:模拟,假设数到m杀一个,剩余n个人,从第i号人开始数数,下一个杀掉的是第i+m-1(i+m-1<n)个人。到后面i+m-1可能会超过n,要回到开头数,所以杀掉的是(i+m-1-1)%n+1个人只要杀的人的编号>k就不是好人注意下标从0开始。代码如下:#include <iostream>using namespace std;int k;int main() { cin>>k; int m = k + 1原创 2020-10-28 12:48:19 · 908 阅读 · 1 评论 -
洛谷P1996 约瑟夫问题【队列】
题目链接:P1996 约瑟夫问题#include <iostream>#include <queue>using namespace std;int n, m, cnt = 1;int main() { queue<int> q; cin>>n>>m; for(int i = 1; i <= n; i++) q.push(i); while(n) { i原创 2020-10-28 09:09:18 · 269 阅读 · 0 评论 -
蓝桥杯 分数
1/1 + 1/2 + 1/4 + 1/8 + 1/16 + …每项是前一项的一半,如果一共有20项,求这个和是多少,结果用分数表示出来。类似:3/2当然,这只是加了前2项而已。分子分母要求互质。程序说明:可以用等比数列的前n项和公式,也可以直接模拟来做。答案:1048575/524288代码如下:#include <iostream>#include <cstdio>using namespace std;int a = 1, b = 1;int gc原创 2020-10-15 22:15:25 · 1316 阅读 · 5 评论 -
AcWing 95. 费解的开关【递推】
题目链接:AcWing 95. 费解的开关你玩过“拉灯”游戏吗?25盏灯排成一个5x5的方形。每一个灯都有一个开关,游戏者可以改变它的状态。每一步,游戏者可以改变某一个灯的状态。游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。我们用数字“1”表示一盏开着的灯,用数字“0”表示关着的灯。下面这种状态1011101101101111000011011在改变了最左上角的灯的状态后将变成:0111111101101111000011011再改变它正中间原创 2020-10-11 16:14:44 · 171 阅读 · 0 评论 -
AcWing 1101. 献给阿尔吉侬的花束【BFS】
题目链接:AcWing 1101. 献给阿尔吉侬的花束阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫。今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪。现在研究员们想知道,如果阿尔吉侬足够聪明,它最少需要多少时间就能吃到奶酪。迷宫用一个 R×C的字符矩阵来表示。字符 S 表示阿尔吉侬所在的位置,字符 E 表示奶酪所在的位置,字符 # 表示墙壁,字符 . 表示可以通行。阿尔吉侬在 1 个单位时间内可以从当前的位置走到它上下左原创 2020-10-10 23:17:27 · 274 阅读 · 0 评论 -
AcWing 466. 回文日期【枚举】
题目链接:AcWing 466. 回文日期在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。牛牛习惯用 8 位数字表示一个日期,其中,前 4 位代表年份,接下来 2 位代表月份,最后 2 位代表日期。显然:一个日期只有一种表示方法,而两个不同的日期的表示方法不会相同。牛牛认为,一个日期是回文的,当且仅当表示这个日期的8位数字是回文的。现在,牛牛想知道:在他指定的两个日期之间(包含这两个日期本身),有多少个真实存在的日期是回文的。一个 8 位数字是回文的,当且仅当对于所有的 i(原创 2020-10-09 23:10:10 · 174 阅读 · 0 评论 -
洛谷P1036 选数【DFS】
题目链接:P1036 选数代码如下:#include <iostream>using namespace std;const int N = 60;int a[N], n, k, res[N], cnt;//判断质数bool prime(int n) { for(int i = 2; i * i <= n; i++) { if(n % i == 0) return false; } return true;原创 2020-10-08 23:27:45 · 152 阅读 · 0 评论 -
递归与递推
题目链接:92. 递归实现指数型枚举 #include <iostream>using namespace std;const int N = 20;int n, st[N];void dfs(int k) { if(k == n) { for(int i = 0; i < n; i++) { if(st[i] == 1) cout<<i + 1<<" ";原创 2020-10-06 12:39:11 · 104 阅读 · 0 评论 -
HDU水题总结
目录HDU2005 第几天?HDU2018 母牛的故事HDU2031 进制转换HDU2030 汉字统计HDU2019 数列有序!HDU2032 杨辉三角HDU4548 美素数HDU2503 a/b + c/d 【最大公约数】HDU2027 统计元音HDU2029 Palindromes _easy version回文字符串&回文数HDU2005 第几天?Time Limit: 2000...原创 2020-03-30 14:25:57 · 551 阅读 · 0 评论 -
HDU1495 非常可乐【BFS】
题目链接:非常可乐Problem Description大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以...原创 2020-03-24 18:15:59 · 174 阅读 · 0 评论 -
洛谷P1002 过河卒【DP】
题目链接:P1002 过河卒程序说明:不需要搜索,很容易就能求出转移方程。f[i][j]从两个方向即f[i - 1][j]和f[i][j - 1]转移过来,但是要注意边界情况,因为下标从0开始会有负数的情况,所以f整个平移一位,f[1][1]可以从f[1][0]转移过来。另外注意马所在的位置也需要被标记。结果很大要开long long。代码如下:#include <iostrea...原创 2020-03-03 16:21:22 · 180 阅读 · 0 评论 -
洛谷P1387 最大正方形【DP】
题目链接:P1387 最大正方形程序说明:参考了Ice_teapoy大佬的题解 第一个题解。f[i][j]表示a[i][j]左上角的最大正方形边长。f[i][j] 由 f[i - 1][j],f[i][j - 1],f[i - 1][j - 1] 三者的最小值转移过来。为什么是最小值?因为比最小值大的话就一定包含0了。三者取最小可以用两个min函数。代码如下:#include <i...原创 2020-02-27 21:39:13 · 182 阅读 · 0 评论 -
洛谷P1020 导弹拦截【LIS 贪心+二分】
题目链接:P1020 导弹拦截程序说明:第一个问题是求最长非上升子序列。upper_bound和lower_bound只能对非递减序列进行查找,由题可知 f 数组是单调递减的,因此需要在upper_bound函数中多一个参数:greater()或者手写cmp。第二个问题是求最长上升子序列(Dilworth定理),证明的方法可以参考大佬的博客:DP-导弹拦截。即最长上升子序列和最大非上升子序...原创 2020-02-26 21:31:43 · 289 阅读 · 0 评论 -
没有上司的舞会【树形DP】
题目链接:285. 没有上司的舞会Ural大学有N名职员,编号为1~N。他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。每个职员有一个快乐指数,用整数 Hi 给出,其中 1≤i≤N。现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。输入格式第一行一个整数...原创 2020-02-26 18:22:09 · 176 阅读 · 0 评论 -
洛谷P1091 合唱队形【线性DP】
题目链接:P1091 合唱队形程序说明:f[i]表示 i 左侧的最长上升子序列,g[i]表示 i 右侧的最长上升子序列。合唱队形的总人数为 f[i] + g[i] - 1。总人数减去合唱队形人数的最大值,就是出列的同学的最小值。代码如下:#include <iostream>using namespace std;const int N = 110;int a[N],...原创 2020-02-25 22:15:10 · 181 阅读 · 0 评论 -
最短Hamilton路径【状态压缩DP】
题目链接: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]...原创 2020-02-25 09:23:39 · 232 阅读 · 0 评论 -
蒙德里安的梦想【状态压缩DP】
题目链接:291. 蒙德里安的梦想 求把NM的棋盘分割成若干个12的的长方形,有多少种方案。例如当N=2,M=4时,共有5种方案。当N=2,M=3时,共有3种方案。如下图所示:(图在链接里.)输入格式输入包含多组测试用例。每组测试用例占一行,包含两个整数N和M。当输入用例N=0,M=0时,表示输入终止,且该用例无需处理。输出格式每个测试用例输出一个结果,每个结果占一行。数据范围...原创 2020-02-24 16:56:39 · 337 阅读 · 0 评论 -
整数划分【DP】
题目链接:900. 整数划分一个正整数n可以表示成若干个正整数之和,形如:n=n1+n2+…+nk,其中n1≥n2≥…≥nk,k≥1。我们将这样的一种表示称为正整数n的一种划分。现在给定一个正整数n,请你求出n共有多少种不同的划分方法。输入格式共一行,包含一个整数n。输出格式共一行,包含一个整数,表示总划分数量。由于答案可能很大,输出结果请对10910^9109+7取模。数据范...原创 2020-02-23 19:21:41 · 930 阅读 · 0 评论 -
洛谷P2758 编辑距离【线性DP】
题目链接:P2758 编辑距离程序说明:dp[i][j]表示前a的前 i 个字母和b的前 j 个字母匹配所需要的最少的操作次数,转移方程可以分为三种情况:删除:a的前 i - 1 个字母和b和前 j 个字母匹配,然后删掉a的第 i 个字母。即dp[i - 1][j] + 1。增添:a的前 i 个字母和b和前 j - 1 个字母匹配,然后把 b[j] 增添到 a[i] 的后面去。即dp[i...原创 2020-02-20 10:01:02 · 236 阅读 · 0 评论 -
洛谷P1880 [NOI1995]石子合并【区间DP】
题目链接:P1880 [NOI1995]石子合并程序说明:这道题和P1090 合并果子有些类似,但合并果子的过程是构造一棵哈夫曼树,而这道题是只能合并相邻的石子,通过模拟可以证明贪心得到的答案是错的,因此用动态规划来做。设dp[l][r]表示从 l 到 r 区间合并石子的代价的最小值,用k来划分区间,每次合并都终归于把 l 到 k - 1 和 k 到 r 两个子区间合并,然后加上区间的和(...原创 2020-02-19 12:30:17 · 256 阅读 · 1 评论 -
最长公共子序列【线性DP】
题目链接:897. 最长公共子序列 给定两个长度分别为N和M的字符串A和B,求既是A的子序列又是B的子序列的字符串长度最长是多少。输入格式第一行包含两个整数N和M。第二行包含一个长度为N的字符串,表示字符串A。第三行包含一个长度为M的字符串,表示字符串B。字符串均由小写字母构成。输出格式输出一个整数,表示最大长度。数据范围1≤N≤1000输入样例:4 5acbdabed...原创 2020-02-18 10:42:07 · 465 阅读 · 0 评论 -
洛谷P1115 最大子段和【线性DP】
题目链接:P1115 最大子段和程序说明:设dp[i]表示以第 i 个数结尾的最大字段和。根据递推式 dp[i] = max(a[i], dp[i - 1] + a[i]),说白了就是如果加上前一个数反而变小的话,就把前面的数都扔掉。注意边界问题,因为第一个数如果是负数的话,有可能dp的起始值会被更新成0。。因此一定要注意dp起始值的初始化,然后从第二个数开始遍历。代码如下:#incl...原创 2020-02-17 22:07:58 · 217 阅读 · 0 评论 -
洛谷P1049 装箱问题【01背包】
题目链接:P1049 装箱问题程序说明:令价值和体积相等就变成01背包问题了。代码如下:#include <iostream>using namespace std;const int N = 20010;int v[N], dp[N], n, m;int main() { cin>>m>>n; for(int i = 1; i <...原创 2020-02-17 18:07:44 · 232 阅读 · 0 评论 -
最长上升子序列【线性DP】【贪心+二分】
题目链接:896. 最长上升子序列 II给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。输入格式第一行包含整数N。第二行包含N个整数,表示完整序列。输出格式输出一个整数,表示最大长度。数据范围1≤N≤100000−109≤数列中的数≤109输入样例:73 1 2 1 8 5 6输出样例:4程序说明:动态规划时间复杂度O(n2n^2n2)dp[...原创 2020-02-17 13:43:55 · 496 阅读 · 0 评论