- 博客(27)
- 收藏
- 关注
原创 迷阵突围——Dijkstra求次短路
问题描述蒜头君陷入了坐标系上的一个迷阵,迷阵上有 n 个点,编号从 1 到 n。蒜头君在编号为 1 的位置,他想到编号为 n 的位置上。蒜头君当然想尽快到达目的地,但是他觉得最短的路径可能有风险,所以他会选择第二短的路径。现在蒜头君知道了 n 个点的坐标,以及哪些点之间是相连的,他想知道第二短的路径长度是多少。注意,每条路径上不能重复经过同一个点。输入格式第一行输入两个整数 n (1≤n≤200) 和 m,表示一共有 n 个点和 m 条边。接下来输入 n 行,每行输入两个整数xi,yi(−500.
2022-04-04 16:10:36 607 1
原创 计蒜客——安排工作
题目:样例输入2 11 02 11 2样例输出2思路:建模,工作顺序明显是一个拓扑排序,我们一般会这么考虑,从哪项工作开始做,即能满足拓扑排序,又能使每一项工作拖ddl的时间的最大值最小但这么想会越想越乱,那么我们能不能反过来建图,假设工作2做之前必须完成工作1,我们将图这么建 2->1 ,即先考虑最后完成的工作,在可以最后一批完成的工作中选出ddl最长的,算出完成前n-1项工作的时间,那么此时totaltime(n-1) - ddl(n) + time(
2022-04-04 15:48:36 283
原创 计蒜客——闯关游戏 SPFA找最长路
问题描述蒜头君在玩一个很好玩的游戏,这个游戏一共有至多 100 个地图,其中地图 1 是起点,房间 n 是终点。有的地图是补给站,可以加 ki点体力,而有的地图里存在怪物,需要消耗 ki 点体力,地图与地图之间存在一些单向通道链接。蒜头君从 1 号地图出发,有 100 点初始体力。每进入一个地图的时候,需要扣除或者增加相应的体力值。这个过程持续到走到终点,或者体力值归零就会 Game Over。不过,他可以经过同个地图任意次,且每次都需要接受该地图的体力值。输入格式第 1 行一个整数 n (...
2022-04-01 00:50:51 301
原创 最短路三种算法:Dijkstra SPFA floyd
解决最短路常用的有三种算法Floyd、Dijkstra、SPFA。三种方法各有优劣Floyd算法是多源最短路算法,复杂度最高(n^3),通常用在点比较少的起点不固定的问题中。能解决负边(负权)但不能解决负环。Dijkstra算法是单源最短路算法,最常用时间复杂度(n^2)优化后可以达到(nlogn),不能解决负边问题,稀疏图(点的范围很大但是边不多,边的条数|E|远小于|V|²)需要耗费比较多的空间。SPFA算法适合稀疏图,可以解决带有负权边,负环的问题,但是在稠密图中效率比Dijkstra要低。.
2022-03-31 13:56:52 1094
原创 两种二进制拆分方法
#include<bits/stdc++.h>using namespace std;int main() { int a = 11; vector<int> b; //第一种 for(int i = 1;i<=a;i*=2){ a = a-i; b.push_back(i); } if(a>0){ b.push_back(a); } for(int i.
2022-03-28 15:52:37 1229
原创 完全背包问题
思路:dp[i][j]意义:从1-i件物品选n件物品总体积为j,每件物品可重复选当枚举到i物品时若j >= v[i]则:dp[i][j] = max(max(dp[i-1][j],dp[i-1][j-v[i]]+w[i]),dp[i][j-v[i]]+w[i]);dp[i-1][j] : 在j空间的包内不放i物品,dp[i][j-v[i]]+w[i]:在已有i物品的j空间包内清出v[i]]空间用来放一件i物品,dp[i-1][j-v[i]]+w[i]:在没有i物品的j空间包...
2022-03-26 21:52:31 278
原创 多重背包问题
/*多重背包问题*/#include<iostream>using namespace std;int dp[21][1001];int w[21], v[21], x[21]; //w是物品的重量,v是价值,x是每一种物品有x几个int n, mw;int dp1[1001]; //优化空间int main() { cin >> n >> mw; for (int i = 1; i <= n; ++i) { ...
2022-03-25 19:04:30 297
原创 0-1背包问题
简单问题描述:有n个各不相同的物品,分别具有Wi的重量和Vi的价值,问在一个载重最大为MaxWeight的背包能装物品价值总和最大是多少?例如一个背包最大载重为4物品1 重量为1 价值为15物品2 重量为3 价值为20物品3 重量为4 价值为30则能装价值总和最大为35,装物品1和3思路参考:动态规划:关于01背包问题,你该了解这些!01背包它来了,它迈着整齐的步伐走来了!https://mp.weixin.qq.com/s/FwIiPPmR18_AJO5eiidT6w用v..
2022-03-25 14:55:02 102
原创 环状矩阵求最大子矩阵和
#include<bits/stdc++.h>using namespace std;#define NIL 1e9long long a[405][405],pre[405][405];int main(){ long long n,m,ans = -NIL,sum,t=0; cin >> n >> m; for(int i = 1;i <= n;i++){ for(int j = 0;j < m;j++){ //由于列...
2022-03-23 15:03:59 355
原创 最大子矩阵和(dp)
问题:求一个N*M的矩阵的最大子矩阵和。比如在如下这个矩阵中:0 -2 -7 09 2 -6 2-4 1 -4 1-1 8 0 -2拥有最大和的子矩阵为:9 2-4 1-1 8其和为15思路:假设这个最大子矩阵的维数是一维,要找出最大子矩阵, 原理与求“最大子段和问题” 是一样的。最大子段和问题的递推公式是 b[j]=max{b[j-1]+a[j], a[j]},b[j] 指的是从0开始到j的最大子段和。例子:假设原始矩阵为:[9, 2, -6, 2], 那么b[] =.
2022-03-23 14:01:45 1726
原创 编辑距离(dp重点)
#include<iostream>#include<bits/stdc++.h>#include<cstdio>using namespace std;int dp[105][105];int main(){ string a,b; cin>>a>>b; int len1 = a.size(); int len2 = b.size(); //边界处理,dp[i][0] =...
2022-03-22 11:41:49 284
原创 最长公共子序列
#include<iostream>#include<bits/stdc++.h>#include<cstdio>using namespace std;int dp[105][105];int main(){ string a,b; cin>>a>>b; int len1 = a.size(); int len2 = b.size(); //为了不出现dp[-1]的情况...
2022-03-22 11:19:25 67
原创 最长上升子序列
输入n个各不相同的数,求其最长上升子序列,例如n = 6,3 2 6 1 4 5,其最长上升子序列为1 4 5长度为3#include<iostream>using namespace std;#include<vector>int a[1005];int dp[1005];int main() { int n; cin >> n; for (int i = 1; i <= n; ++i) { cin >> a[i]; }
2022-03-21 23:52:46 87
原创 计蒜客——数组的分组(dp)
一个长度为 n 的数组 a,我们可以把它分成任意组,每一组是一段连续的区间。比如数组1,2,3,4,5 可以分成 (1,2),(3,4,5) 两组。每个分组都有一个权值,这个权值就是分组里面每个数的乘积对1000 取模的结果。对于数组 a 的一个分组方案,总权值就是每个分组的权值和。那么对于数组 a,分组以后最大的权值和是多少?输入格式输入第一行一个整数 n(1≤n≤1000)。接下来一行 n 个整数,表示数组 a,数组中每个元素都小于等于 100。输出格式数组最大的分组权值和。.
2022-03-21 20:43:10 260
原创 计蒜客——一维消消乐(理解dp)
/*注释中有思路*/#include<iostream>using namespace std;int w[10005];int dp[10005][2]; //1表示与前边珠子一起结合消去,0表示没有消去int main() { int n; cin >> n; for (int i = 1; i <= n; ++i) { cin >> w[i]; } dp[1][0] = 0; //从第二颗珠子起,每颗珠子都有两种状态...
2022-03-21 18:49:04 196
原创 计蒜客——逃生(dp)
蒜头君在玩一款逃生的游戏。在一个n×m 的矩形地图上,蒜头位于其中一个点。地图上每个格子有加血的药剂,和掉血的火焰,药剂的药效不同,火焰的大小也不同,每个格子上有一个数字,如果格子上的数字是正数说明是一个药剂代表增加的生命值,如果是负数说明是火焰代表失去的生命值。蒜头初始化有 v 点血量,他的血量上限是 c,任何时刻他的生命值都不能大于血量上限,如果血量为 0 则会死亡,不能继续游戏。矩形地图上的四个角(1,1),(1,m),(n,1),(n,m)为游戏的出口。游戏中只要选定了一个出口,就必须朝着这
2022-03-21 18:16:29 207
原创 计蒜客——一维跳棋BFS(疑问?为什么不用判断跳棋的合法性)
思路:此题使用bfs有些抽象,不像迷宫哪些容易想到,不知道如何扩散。开始思路是以空格坐标作为参数,把能到达当前空格坐标的所有点加入队列,当空格位于N+1的位置且左右两边的符号不同时,说明棋子归位了。对于查找问题,unordered_map会更加高效一些,因此遇到查找问题,常会考虑一下用unordered_map。本次在标记字符串时用了unordered_map,在查询方面较快#include<iostream>#include<cstdio>#inclu...
2022-03-18 18:04:55 209
原创 计蒜客——乳草的侵占
本题一开始有两个地方卡住了,一是初始化地图时,用scanf("%c",&mp[i][j]);一直出错,检查了好久二是怎么做到坐标轴下标映射到矩阵下标(从0,0开始,参考了别人的代码Mx = Mx - 1;My = My - 1;Mx = Y - Mx - 1;后来才想到其实可以将行倒着读,并且让矩阵从下标(1,1)开始,列正着读就行,#include <iostream>#include <cstdio>using namespa...
2022-03-18 13:11:31 137
原创 计蒜客——数独
题目链接:结果填空:数独 - 题库 - 计蒜客题号:A1599;知识点:深度优先搜索;蒜头君今天突然开始还念童年了,想回忆回忆童年。他记得自己小时候,有一个很火的游戏叫做数独。便开始来了一局紧张而又刺激的高阶数独。蒜头君做完发现没有正解,不知道对不对? 不知道聪明的你能否给出一个标准答案?标准数独是由一个给与了提示数字的 $9 \times https://nanti.jisuanke.com/t/A1599输入结果:1 2 6 7 3 4 5 9 83 7 8 5 9 2 6 1 44 9.
2022-03-14 16:21:57 390
原创 计蒜客——马的覆盖点
样例输出............................#.#.....#.#.#....####.#...#####.#..##.###...#.###.#..######...#include <cstdio>using namespace std;#include <vector>#include <iostream>char map[105][105];int dir[8][2] = { {-2,-1}...
2022-03-11 17:08:22 214
原创 计蒜客——家谱(深度搜索)
家谱,又称族谱、宗谱等,是一种以表谱形式,记载一个家族的世系繁衍及重要人物事迹的书。皇帝的家谱称玉牒,如新朝玉牒、皇宋玉牒。它以记载父系家族世系、人物为中心,由正史中的帝王本纪及王侯列传、年表等演变而来。家谱是一种特殊的文献,就其内容而言,是中国五千年文明史中具有平民特色的文献,记载的是同宗共祖血缘集团世系人物和事迹等方面情况的历史图籍。家谱属珍贵的人文资料,对于历史学、民俗学、人口学、社会学和经济学的深入研究,均有其不可替代的独特功能。这一天蒜头君拿到了自己家的家谱,蒜头君便想知道,在自己家的家谱
2022-03-11 16:11:34 253
原创 计蒜客题目:汉诺塔2
#include <cstdio>using namespace std;long long f[65], g[65]; //f是最小移动次数,g是最小消耗体力/*很容易知道最优的移方法就是最省力的先将n-1个盘子移至中转柱子,再将最后一个盘子移至目标柱子,随机将n-1个盘子类似于前面移至目标柱子f[n] = f[n-1]+1+f[n-1]; f[1] = 1;g[n] = g[n-1] + n +g[n-1];g[1] = 1;*/int main() ...
2022-03-10 01:07:49 139
原创 计蒜客——机器人
蒜头君收到了一份礼物,是一个最新版的机器人。这个机器人有 4 种指令:1.forward x,前进 x 米。2.back x,先向后转,然后前进 x 米。3.left x,先向左转,然后前进 x 米。4.right x,先向右转,然后前进 x 米。现在把机器人放在坐标轴原点,起始朝向为 x 轴正方向。经过一系列指令以后,你能告诉蒜头君机器人的坐标位置吗。坐标轴上一个单位长度表示 1 米。输入格式第一行输入一个整数 n(1≤n≤100) 表示指令的个数。接下里 n 行,每行输入形如上面的指
2022-03-08 15:25:30 82
原创 打印选课学生名单
原题链接:PTA | 程序设计类实验辅助教学平台思路:用vector集合保存每门课程对应的学生一开始我是用set集合保存每门课程对应的学生数量,这样就省去了排序的过程,但这样做会导致测试点5超时。不如先用vector集合存储每门课程对应的学生,再进行排序来得快。时间复杂度和空间复杂度均与每门课程对应的学生数量有关。#include<iostream>#include<algorithm>#include<vector>using namespac
2022-03-07 11:20:34 209
原创 洛谷 P1115 最大子段和
题目描述给出一个长度为 n的序列 a,选出其中连续且非空的一段使得这段和最大。输入格式第一行是一个整数,表示序列的长度 n。第二行有 n个整数,第 i个整数表示序列的第 i个数字 ai。输出格式输出一行一个整数表示答案。输入输出样例输入 #172 -4 3 -1 2 -4 3输出 #14说明/提示样例 1 解释选取 [3, 5] 子段 {3, -1, 2},其和为 4。数据规模与约定对于40\% 的数据,保证 n≤2e3。 对...
2022-03-03 13:01:30 440
原创 蓝桥杯13年省赛——十字图
小明为某机构设计了一个十字型的徽标,如下所示:层数为4层,如下图:输入格式一个正整数 n (n<30) 表示要求打印图形的层数。输出格式对应包围层数的该标志。样例1n=1n=3由图可观察,图形的行列数相等,且行col=4*n+5#include <iostream>using namespace std;const int MAX = 130;bool map[MAX][MAX]; //true = '$',false
2022-02-28 23:47:25 167
原创 *节假日*
输入格式:第一行为该年y。接下来四行分别输入四个节日的日期。最后一行输入一个整数表示该年一月一日星期几。输入样例:20171 284 45 3010 47输出样例:113#include <iostream>#include <cstdlib>using namespace std;int month[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; //月份int mm[10] = ...
2022-02-28 16:08:33 135
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人