课程_DSA
课程“数据结构与算法”中的作业与练习
w112348
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
多项式加法(链表)
总时间限制:1000ms 内存限制:5000kB 描述 我们经常遇到两多项式相加的情况,在这里,我们就需要用程序来模拟实现把两个多项式相加到一起。首先,我们会有两个多项式,每个多项式是独立的一行,每个多项式由系数、幂数这样的多个整数对来表示。 如多项式2x20- x17+ 5x9- 7x7+ 16x5+ 10x4+ 22x2- 15 对应的表达式为:2 20 -1 17 5 9 - 7 7 16 5 10 4 22 2 -15 0。 为了标记每行多项式的结束,在表达式后面加上了...原创 2020-06-20 16:22:35 · 337 阅读 · 0 评论 -
逆转广义表
题目 请编写递归算法, 逆转广义表中的数据元素。例如: 将广义表: (a,((b,c),()),(((d),e),f))逆转为:((f,(e,(d))),((),(c,b)),a)。 代码 #include <iostream> #include <cstring> #include <algorithm> using namespace std; void reverse_str(char *s, int l, int r) { int n = r-l;原创 2021-01-03 16:12:43 · 1150 阅读 · 0 评论 -
Window Pains(图的应用)
题目链接:Window Pains 分析 转化为最短路问题 #include <iostream> #include <cstring> #include <algorithm> using namespace std; char buf[100]; int a[10][10]; int io[10] = {0, 0, 0, 0, 1, 1, 1, 2, 2, 2}; int jo[10] = {0, 0, 1, 2, 0, 1, 2, 0, 1, 2}; bool原创 2020-12-15 17:22:43 · 202 阅读 · 0 评论 -
最短路算法小结
普通优先队列为O((m+n)logm)O((m+n)logm)O((m+n)logm) 索引有限队列为O((m+n)logn)O((m+n)logn)O((m+n)logn) 图中的是后者原创 2020-12-15 17:15:21 · 163 阅读 · 0 评论 -
所有拓扑序列
题目链接:1270:Following Orders 分析 回溯法 最坏复杂度为O(n!)O(n!)O(n!),也就是不含有向边的图,节点1~n的全排列 #include <iostream> #include <cstring> #include <algorithm> #include <set> using namespace std; set<char> nodes; int indeg[300]; bool vis[300]; in原创 2020-12-15 15:01:54 · 608 阅读 · 0 评论 -
Sequence(堆/QuickSelect)
题目链接:Sequence 分析: 依次从各个序列中选一个数,只需维护top n的和 这top n个数和新sequence的n个数两两相加,一共n2n^2n2个数 如果从这n2n^2n2个数中选top n,用quickselect总复杂度要O(mn2)O(mn^2)O(mn2),用堆要O(mn2logn)O(mn^2logn)O(mn2logn),不管怎样都会超时 其实我们不需要考虑n2n^2n2个数,只需要考虑n(1+12+13+⋯+1n)=O(nlogn)n(1+\dfrac12+\dfrac13+\原创 2020-12-14 00:16:21 · 162 阅读 · 0 评论 -
Prim次小生成树
题目链接:1679:The Unique MST 分析: 参考了这篇文章,该文章采用邻接矩阵,我们采用邻接表 核心思想: 在最小生成树上添加一条边,必然成环 从环中删除一条边(不是新加进来的),新的总权值≥\ge≥旧的总权值 如果相等则说明最小生成树不唯一 从所有新权值中,选择不等于旧权值的最小的,就对应次小生成树 具体实现: 对于最小生成树,用数组connected[i][j]记录节点i与节点j之间是否连边,用数组maxedge[i][j]记录从i到j的路径上最大的边权重。两个数组随着prim算原创 2020-12-13 14:48:38 · 187 阅读 · 0 评论 -
次短路
回头理思路,很神奇的一点是传统初始化手段不好用?? #include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <queue> #include <vector> using namespace std; const int MAXN = 5005, MAXR = 100005, INF = 0x7fffffff; int原创 2020-12-13 00:24:49 · 105 阅读 · 0 评论 -
字符串乘方、前缀中的周期(KMP)
总时间限制: 3000ms 内存限制: 65536kB 描述 给定两个字符串a和b,我们定义ab为他们的连接。例如,如果a=”abc” 而b=”def”, 则ab=”abcdef”。 如果我们将连接考虑成乘法,一个非负整数的乘方将用一种通常的方式定义:a0=””(空字符串),a(n+1)=a*(a^n)。 输入 每一个测试样例是一行可打印的字符作为输入,用s表示。s的长度至少为1,且不会超过一百万。最后的测试样例后面将是一个点号作为一行。 输出 对于每一个s,你应该打印最大的n,使得存在一个a.原创 2020-12-12 16:42:26 · 1508 阅读 · 1 评论 -
排序的代价(索引排序)
总时间限制: 10000ms 单个测试点时间限制: 5000ms 内存限制: 65536kB 描述 现有一排装满货物的箱子,重量各不相同(都已标示在箱子上),为了进行后面的工作,需要将这些箱子按轻重有序放置,但只有一名工作人员来完成这项工作,由于空间有限,他只能通过不断交换两个箱子(可不相邻)的位置的方式来实现箱子的排序。他知道这样一定可以完成任务,但搬箱子很累,所以他希望找到一种最省力的方式来完成工作,假设一次交换两个箱子的代价为这两个箱子的重量之和,那么这项工作的总代价为此过程中所有“交换”的代价.原创 2020-12-10 23:19:01 · 510 阅读 · 0 评论 -
开关问题(高斯消元法)
总时间限制: 1000ms 内存限制: 65536kB 描述 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开。你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态。对于任意一个开关,最多只能进行一次开关操作。你的任务是,计算有多少种可以达到指定状态的方法。(不计开关操作的顺序) 输入 输入第一行有一个数K,表示以下有K组测试数据。 每组测试数据.原创 2020-12-09 22:18:08 · 940 阅读 · 0 评论 -
现代艺术(栈)
总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB 描述 在对二维艺术作品感到厌烦之后,伟大的艺术牛Picowso决定从事创作一项更为小众的艺术形式,一维画。 尽管目前她的画作可以用一个由颜色组成的长度为N(1~ 100000)的数组表示,但她的创作风格依然保持不变:从一张空白的矩形画布上,不断地画上一些矩形,在一维的情况下,这些矩形就只是一个区间。她用N种颜色,颜色编号为1~N进行创作,每种颜色只使用一次,之后使用的颜色可以完全的覆盖之前在相同位置上的颜色。.原创 2020-12-05 21:30:44 · 1231 阅读 · 0 评论 -
Parity Game(并查集)
总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB 描述 Now and then you play the following game with your friend. Your friend writes down a sequence consisting of zeroes and ones. You choose a continuous subsequence (for example the subsequence from the thir.原创 2020-12-05 21:26:31 · 529 阅读 · 0 评论 -
栈&二叉树-表达式·表达式树·表达式求值
总时间限制: 1000ms 内存限制: 65535kB 描述 众所周知,任何一个表达式,都可以用一棵表达式树来表示。例如,表达式a+b*c,可以表示为如下的表达式树: + / \ a * / \ b c 现在,给你一个中缀表达式,这个中缀表达式用变量来表示(不含数字),请你将这个中缀表达式用表达式二叉树的形式输出出来。 输入 输入分为三个部分。 第一部分为一行,即中缀表达式(长度不大于50)。中缀表达式可能含有小写字母代表变量(a-z),也可能含有运...原创 2020-10-31 19:37:45 · 1968 阅读 · 0 评论 -
树-树的转换
总时间限制:5000ms 内存限制:65536kB 描述 我们都知道用“左儿子右兄弟”的方法可以将一棵一般的树转换为二叉树,如: 0 0 / | \/ 123 ===> 1 / \ \ 4 5 2 ...原创 2020-10-31 19:30:13 · 1923 阅读 · 0 评论 -
树-物质分解记录
总时间限制:60000ms 单个测试点时间限制:6000ms 内存限制:131064kB 描述 对物质分解记录的结构进行统计分析。 例如: 给出一份物质分解记录。 Material_1 { Material_2 { Material_3 Material_4 Material_5 { Material_6 Material_7 }...原创 2020-10-31 19:22:11 · 517 阅读 · 0 评论 -
队列-利用队列进行数字排序
【题目】 题目链接 【分析】 利用数据的绝对大小而不是相对大小进行排序,时间复杂度可能很高。普通的哈希方法可能因为数据稀疏导致效率低下,分位操作解决了这个问题! 具体实现过程中用stringstream规避了重复输出数据的麻烦 #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #include <vector> #include &.原创 2020-10-13 15:01:34 · 1404 阅读 · 0 评论 -
栈-直接计算中缀表达式
思路与“中缀表达式转后缀表达式”相似 #include <iostream> #include <cstring> #include <stack> #include <cmath> using namespace std; stack<double> num; stack<char> oprt; char s[1005]; int l = 0; void in(){ char t[1005]; cin.ge.原创 2020-06-23 14:48:33 · 331 阅读 · 0 评论 -
队列-单调队列-滑动窗口
总时间限制:12000ms 内存限制:65536kB 描述 给定一个长度为n(n<=10^6)的数组。有一个大小为k的滑动窗口从数组的最左端移动到最右端。你可以看到窗口中的k个数字。窗口每次向右滑动一个数字的距离。 下面是一个例子: 数组是[1 3 -1 -3 5 3 6 7], k = 3。 窗口位置 最小值 最大值 [13-1]-35367 -1 3 1[3-1-3]5367 -3...原创 2020-10-05 10:34:26 · 1075 阅读 · 0 评论 -
杂题-Number Sequence
总时间限制:1000ms 内存限制:65536kB 描述 A single positive integer i is given. Write a program to find the digit located in the position i in the sequence of number groups S1S2...Sk. Each group Sk consists of a sequence of positive integer numbers ranging from 1 ..原创 2020-09-29 09:44:00 · 617 阅读 · 0 评论
分享