近一些年北大研究生推免机试题目都会在OpenJudge-百练平台上,但是比赛已经结束,不能提交题目,所以我借助Virtual Judge平台创建了一个比赛的链接,密码为fighting,和大家一起学习,同时写下一篇简单的总结。
题目总的比较简单,都是简单的模拟和常用的算法。当然最后一题,没有看,估摸是个大模拟的题目,被题目长度击退,估计太麻烦也写不出。
A - 有趣的跳跃
读入数据,相邻的数据相减的绝对值保存到数组,排序之后检查数组是否依次是1~n-1的值即可。
B - 玛雅历
两种日期的互换,主要是读懂题意。自己定义的初始化函数记得调用。
C - 走迷宫
迷宫中的最短路问题,标准版bfs既可。如果需要打印路径,只需要每一个位置保存前一个位置,采用逆向打印。
D - 最大上升子序列和
最长上升子序列的dp问题解法基本相同,在最长上升子序列中,dp[i]保存到i为止,最长上升子序列的长度,而本问题中,保存的最大上升子序列的和。因为在dp的过程中,每一个位置i都遍历了前一个可能的上升子序列的前一位置,取出最优的保存。可以保证问题求解的正确性。
E - Yogurt factory
贪心题。
题意是每一周需要一定数量的Yougurt,每一周生产的Yougurt价格不同,但是仓库空间无限大,每一周需要的Yougurt都可以在前面任意的周内做好,单位内存储成本固定,每一份Yougurt每周为S。求最小的cost。
逆向遍历,从后往前,因为当前周的产品可以由前面周生产,遍历前面全部周,cost最小的那一周即为本周产品的生产周。
可能还有更好的遍历策略,但是这样n*n的复杂度没有问题。
贪心的正确性在于每一周的产品不会在不同周生产,同一周生产后面某周的产品即可保证最优。
F - Wireless Network
基本上是并查集裸体,唯一变化是的一些结点被唤醒之后,暴力查找范围内的唤醒结点连接。
G - Arctic Network
这个题在两年前ac过,那次主要是数组开小了RE了几次,这次却WA了几次,原来是多组输入时,边的数量没有清空。
想一想可以确定,最小生成树的简单应用,使用的是Kruskal,然后策略是贪心,选择前面最小的前n-m条边连接,所以答案就是第n-m条边的长度,由于Kruskal算法排序了,所以并查集操作的时候,只要连接了n-m条边,输出当前边。(边从1开始,n为点个数,m为已经联通的点)。