课程_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 · 283 阅读 · 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 · 923 阅读 · 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 · 139 阅读 · 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 · 120 阅读 · 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 · 569 阅读 · 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 · 112 阅读 · 0 评论 -
Prim次小生成树
题目链接:1679:The Unique MST分析:参考了这篇文章,该文章采用邻接矩阵,我们采用邻接表核心思想:在最小生成树上添加一条边,必然成环从环中删除一条边(不是新加进来的),新的总权值≥\ge≥旧的总权值如果相等则说明最小生成树不唯一从所有新权值中,选择不等于旧权值的最小的,就对应次小生成树具体实现:对于最小生成树,用数组connected[i][j]记录节点i与节点j之间是否连边,用数组maxedge[i][j]记录从i到j的路径上最大的边权重。两个数组随着prim算原创 2020-12-13 14:48:38 · 133 阅读 · 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 · 72 阅读 · 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 · 1393 阅读 · 1 评论 -
排序的代价(索引排序)
总时间限制: 10000ms单个测试点时间限制: 5000ms内存限制: 65536kB描述现有一排装满货物的箱子,重量各不相同(都已标示在箱子上),为了进行后面的工作,需要将这些箱子按轻重有序放置,但只有一名工作人员来完成这项工作,由于空间有限,他只能通过不断交换两个箱子(可不相邻)的位置的方式来实现箱子的排序。他知道这样一定可以完成任务,但搬箱子很累,所以他希望找到一种最省力的方式来完成工作,假设一次交换两个箱子的代价为这两个箱子的重量之和,那么这项工作的总代价为此过程中所有“交换”的代价.原创 2020-12-10 23:19:01 · 390 阅读 · 0 评论 -
开关问题(高斯消元法)
总时间限制: 1000ms内存限制: 65536kB描述有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开。你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态。对于任意一个开关,最多只能进行一次开关操作。你的任务是,计算有多少种可以达到指定状态的方法。(不计开关操作的顺序)输入输入第一行有一个数K,表示以下有K组测试数据。每组测试数据.原创 2020-12-09 22:18:08 · 841 阅读 · 0 评论 -
现代艺术(栈)
总时间限制: 10000ms单个测试点时间限制: 1000ms内存限制: 65536kB描述在对二维艺术作品感到厌烦之后,伟大的艺术牛Picowso决定从事创作一项更为小众的艺术形式,一维画。尽管目前她的画作可以用一个由颜色组成的长度为N(1~ 100000)的数组表示,但她的创作风格依然保持不变:从一张空白的矩形画布上,不断地画上一些矩形,在一维的情况下,这些矩形就只是一个区间。她用N种颜色,颜色编号为1~N进行创作,每种颜色只使用一次,之后使用的颜色可以完全的覆盖之前在相同位置上的颜色。.原创 2020-12-05 21:30:44 · 1125 阅读 · 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 · 459 阅读 · 0 评论 -
栈&二叉树-表达式·表达式树·表达式求值
总时间限制:1000ms内存限制:65535kB描述众所周知,任何一个表达式,都可以用一棵表达式树来表示。例如,表达式a+b*c,可以表示为如下的表达式树: +/ \a */ \b c现在,给你一个中缀表达式,这个中缀表达式用变量来表示(不含数字),请你将这个中缀表达式用表达式二叉树的形式输出出来。输入输入分为三个部分。第一部分为一行,即中缀表达式(长度不大于50)。中缀表达式可能含有小写字母代表变量(a-z),也可能含有运...原创 2020-10-31 19:37:45 · 1769 阅读 · 0 评论 -
树-树的转换
总时间限制:5000ms内存限制:65536kB描述我们都知道用“左儿子右兄弟”的方法可以将一棵一般的树转换为二叉树,如:0 0/ | \/ 123 ===> 1 / \ \4 5 2...原创 2020-10-31 19:30:13 · 1565 阅读 · 0 评论 -
树-物质分解记录
总时间限制:60000ms单个测试点时间限制:6000ms内存限制:131064kB描述对物质分解记录的结构进行统计分析。例如:给出一份物质分解记录。Material_1{Material_2{Material_3Material_4Material_5{Material_6Material_7}...原创 2020-10-31 19:22:11 · 425 阅读 · 0 评论 -
队列-利用队列进行数字排序
【题目】题目链接【分析】利用数据的绝对大小而不是相对大小进行排序,时间复杂度可能很高。普通的哈希方法可能因为数据稀疏导致效率低下,分位操作解决了这个问题!具体实现过程中用stringstream规避了重复输出数据的麻烦#include <iostream>#include <cstring>#include <algorithm>#include <cmath>#include <vector>#include &.原创 2020-10-13 15:01:34 · 1331 阅读 · 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 · 286 阅读 · 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 · 897 阅读 · 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 · 511 阅读 · 0 评论