![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
TodayMagic
这个作者很懒,什么都没留下…
展开
-
2021 RoboCom 世界机器人开发者大赛-本科组(初赛)7-4 疫情防控 (30 分)
题目大意:给定一个 nnn 个顶点, mmm 条边的图,现在对图进行 ddd 次操作, 每次操作为标记编号为 ccc 的顶点不能走(即删除与 ccc 相连的边),每次操作中又有 qqq 次询问:编号 xxx 和 编号 yyy 之间是否有通路。思路:这个题目如果采用每次询问一次就遍历图,那么复杂度显然是 5∗10000∗1000∗10005 * 10000 * 1000 * 10005∗10000∗1000∗1000, 显然会超时。因此,这种暴力 dfsdfsdfs 模拟算法显然会超时。仔细一想,原创 2021-10-19 20:23:03 · 280 阅读 · 0 评论 -
2021 RoboCom 世界机器人开发者大赛-本科组(复赛)7-2 拼题A打卡奖励 (25 分)
题目大意:给定 NNN张打卡卷,第 iii 张打卡卷需要 mim_imi 分钟做完,完成后可获得 cic_ici 枚奖励的金币。问 MMM 分钟内最多可以得到多少金币。思路:显然这是一个01背包问题。但是,按照常规的想法,把时间看成是物品的体积,金币看成是价值,则 MMM 就是背包的容量。但是根据题目的数据范围, M(≤365×24×60)M(≤365×24×60)M(≤365×24×60) ,复杂度 NMNMNM (N<1000)(N < 1000)(N<1000) 肯定会原创 2021-10-18 20:07:58 · 423 阅读 · 0 评论 -
Coderforces 1360F Spy-string
题目大意:给定 n个长度为m的字符串aia_iai,能否找到一个字符串s,使得s串与aiaiai串至多存在一个不相同的字符。找出这样的字符串并输出它,如果没有找到则输出-1。思路:暴力枚举求解。每次把 a1a_1a1 的所有可能是答案的字符串给枚举一遍,然后判断这个字符串和 a2到ana_2 到 a_na2到an的串是不是满足条件。代码:#include <bits/stdc++.h>using namespace std;const int N = 15;int n,原创 2021-09-20 10:07:48 · 56 阅读 · 0 评论 -
Codeforces 1381A2 Prefix Flip (Hard Version)
题目大意给定两个只含 0 和 1 字符串 a , b ,在下面这种变换规则下,a 经过多少变换次数得到 b,输出该次数并输出每次变换的位置,并且变换次数不超过2∗n2 * n2∗n。变换规则:选择字符串 a 的一个前缀,同时反转前缀中的位( 0 变成 1 , 1 变成 0 ),并反转前缀中位的顺序。例:a=01011a = 01011a=01011, 从第2个位置进行操作,先反转位,得到a=10011a = 10011a=10011,再逆序该前缀,得到 a=01011a = 01011a=01011。原创 2021-09-13 21:21:41 · 162 阅读 · 0 评论 -
拓扑排序(topsort)的两个应用
应用一:检测有向图中是否有环,即将入度为0的点加入队列应用二:找出无向图中存在的环,即将度为1的点加入队列,剩下没入过队的点就是环上的点。bool topsort(){ int cnt = 0; queue<int> q; for(int i = 0; i < n; i++){ if(inDegree[i] == 0) q.push(i); } while(!q.empty()){ int u =原创 2021-03-28 10:17:40 · 298 阅读 · 0 评论 -
Floyd(弗洛伊德)算法
在看我这篇博客之前,请大家观看B站的视频Dijkstra,floyd算法动画演示讲解,这位up主讲的很好,然后你看模板代码,相信你会有所收获。 上篇博客我讲了Dijkstra算法,只要你理解了Dijkstra算法,那么Floyd算法就会变得很简单,无非就是求全员最短路问题,即,图中任何两个顶点的最短距离。原理:如果存在顶点 k ,使得顶点 i 和顶点 j 之间的当前最短路距离缩短,则使用 k 做为中转点,即由 i —> j 变为 i — k — j。表达式:如果dis[i][k] + dis[k原创 2021-01-23 17:38:38 · 165 阅读 · 0 评论 -
Dijkstra(迪杰斯特拉)算法
在看我这篇博客之前,请大家观看B站的视频Dijkstra,floyd算法动画演示讲解,这位up主讲的很好,然后你看模板代码,以及我给的例题,相信你会大有收获。1.Dijkstra算法Dijkstra算法解决的是单源最短路问题,并且边权只能为正值。//模板 int n, g[MAXV][MAXV];bool visit[MACV] = {false};int dis[MAXV]//起点到各点的最短长度 void Dijkstra(int s)//s为起点 { fill(dis, dis .原创 2020-12-15 17:51:11 · 189 阅读 · 1 评论 -
lower_bound 函数的C语言实现
题目大意:请实现有重复数字的有序数组的二分查找。输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一。样例输入:5 41 2 4 4 5样例输出3#include <stdio.h>#include <stdlib.h>int a[1000005];int main() { int n, m; scanf("%d %d",&n, &m); int i; for(i = 0; i < n; i++)原创 2020-12-13 10:20:21 · 1315 阅读 · 0 评论 -
LeetCode106. 从中序与后序遍历序列构造二叉树
做这个题之前推荐大家去看浙大柳婼的一遍博客:二叉树已知中序后序遍历重构二叉树根据一棵树的中序遍历与后序遍历构造二叉树。 注意:你可以假设树中没有重复的元素。例如,给出:中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]返回如下的二叉树:3/ \9 20/ \15 7class Solution {public: TreeNode* buildTree(vector<int>原创 2020-12-10 19:08:35 · 80 阅读 · 2 评论 -
LeetCode 515. 在每个树行中找最大值
您需要在二叉树的每一行中找到最大的值。示例:class Solution {public: vector<int> largestValues(TreeNode* root) { vector<int> ans; queue<TreeNode*> q; if(root != NULL) q.push(root); while(!q.empty()){ int n = q原创 2020-12-08 20:02:09 · 48 阅读 · 0 评论 -
洛谷P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles
洛谷P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles此题是一个很经典的动态规划题目,对刚入门的同学来说是一个很好的练习题目。如果熟悉了解回溯法的同学,你会立刻发现这是一个动态规划题。思路:定义[i][j]为出发点时的能够得到的最大和,显然,在这个状态定义下,最大和的解为dp[1][1]。状态转移:从[i][j]出发有两种决策.一种是往左走到[i+1][j],此时需要求从[i+1][j]为出发点的最大和;同理向右走到[i+1][j+1],此时需要求从[i+1原创 2020-10-28 19:53:13 · 135 阅读 · 0 评论