2019南京大学计算机系本科生开放日题目

2019/7/12,本地组

这是据应届新生回忆的题目,表述方法可能不太严谨,并没有给出数据范围,仅作参考。

另外,下面的时间复杂度均属于作者的思路,不代表AC解法。

1. 给一个字符串S,由()和[]组成。其中()和[]的值为1,AB的值为A+B,(A)的值为A*2,[A]的值为A+1,若括号不配对输出-1。求S所代表的值。

这是一个模拟多项式计算的小题目,重点考察括号匹配。由于(A)的存在,该题在括号匹配的同时需要将数值压栈。由于不知道字符串长度,可能存在2^31爆int的坑。

(后来由AC同学得知本题并没有爆int)

时间复杂度O(n)

2. 给一个数组A,其下标为1~n,其中第i个数A[i]代表下一步能够跳到的位置(比如A[1]=3,那么一步就可以从位置1跳到位置3),每一次操作可以选择将A[i]+1,或者-1,或者跳一步,问从位置1走到位置n最少需要的操作数。

样例1

输入

5
3 4 2 5 3

输出

3

解释

将A[1]+1,+1,然后跳到5。

这题乍一看是3^n的剪枝回溯,但跳格子问题一般会有各种简化,经验告诉我们还有更好的解法。

本题的难点在于如何分析问题,将其化为已知问题。

首先,问题求最小步数,每个位置又对应固定的下一位置,所以同一位置不能被经过2次。那么改变A[i]并跳跃的过程,就等价于跳跃后在相邻位置间移动。因此,问题中的操作可以修改为,每一次操作可以选择跳一步;在位于位置1以外的位置时,可以选择向相邻位置移动一格。

至此,该问题已经可以用图表示,并可以应用bfs。

时间复杂度O(n)

3. 一个人有N元,M本书,每本书A[i]元,问不超过N元最多能买多少本书,且能买最多本书的组合有多少种。N, M<500

样例1

输入

5 4
2 3 3 4

输出

2 2

dp背包问题,对于A[i],dp[n][m]+=dp[n-A[i]][m-1] ,n<=N, 记录最大m=maxm。输出dp[i][maxm],i<=N的和。

时间复杂度O(NM^2),感觉有点蠢,不知道有没有优化。


2019/7/16,外地组

题目来源:https://blog.csdn.net/HanielF/article/details/95677016

偶然看到也有外地组的题目,就顺便写一下自己的感想。

今年外地组题目的门槛确实高了不少,比本地生难度还高一点。ww

1. 大概意思是,给你一个不超过100位的数n,和一个不超过100的数字k,要求从数n中去掉k个数字,然后使得去掉k个数之后,n最小。

题解参考链接:https://blog.csdn.net/C20190413/article/details/77368590

实际上可以一次遍历,时间复杂度O(n)

2. 大概意思是,有B个男孩,G个女孩,要求所有男孩女孩排成一队,连续的男孩个数不可以超过K个,问一共有多少种排法。

本题可以看作(G+1)个抽屉,每个抽屉最多放K个物品,一共有B个物品,问不同的放法。这样,本题很容易想到DP解法。

dp[g][b]+=dp[g-1][b-i], 0<=i<min(b, k),其中dp存储插入位置g时已使用b个男孩的可能数。dp[0][0]=1,输出dp[G+1][B]

(原来是年年有DP啊)

应用双指针可降低遍历复杂度,时间复杂度O(BG)

3. 给出一个二叉树的前序遍历序列和后序遍历序列,序列是没有空节点#号的,只有字母,问通过这两个序列可以构造多少中不同的二叉树,因为树的样子不一样,遍历的序列是可能一样的。比如前序序列:abc,后序序列cba,就有4种不同的树

前序遍历序列和后序遍历序列可以确定一个树的连接关系,只是在二叉树中若某节点只有一个子节点,那么无法确定子节点的左右位置。因此目标可以转为统计只有一个子节点的节点个数a,输出2^a。

遍历方法较为简单,这里就不写了

最坏时间复杂度O(n^2)

猜你喜欢

转载自blog.csdn.net/hizcard/article/details/95601101