这几天接连进行了两场3小时的机考,搞得有点心累……不过结果还是很不错的A_A

数算实习的机考乃是首次与所有的竞赛大爷们同场考试,而且边上就坐着一位……造成了一定的精神压力-_-。不过还算问题不大, 我心态好^_^

第一题,给一个序列(N <= 20000,序列中数字 <=1000000),然后给出Q个询问(Q <= 200000),每次询问一个区间,求这个区间的极差.

这题就是RMQ, 而且空间不够可以先离散化.或者线段树也可以, 这题时间卡的并不紧. 当然, 也有我这等搞笑流选手, 由于去年机考考了可持久化线段树, 我一看这题, 哎, 能用! 于是果断用了可持久化线段树......倒也能做, 也不长. 就是每次求出区间首尾两棵树之差之后, 询问最小则一路向左找, 左边size = 0再向右; 询问最大则一路向右, 右边size = 0再向左. 然后把离散化之后的数换回原序列中的数, 作差即可.

第二题是个填空, 给定一个序列, 表示到银行来排队的人, 从前往后表示来到银行的先后顺序. 到银行之后要排队, 每个人有两个属性, 第一个是编号num, 第二个是他会插队到多少个人前面...这个数叫做jump吧. 输出最后的队伍(从队尾到队头输出每个人的编号).

这题给的算法是BIT, 从最后一个人往前依次处理,找到这个人应该在的位置. 方法是二分查找. 假设对于每个位置维护一个信息occ, 表示这个位置被占1或空闲0, 然后设occ的前缀和为Socc, 则正确的插入位置pos应当满足 pos = jump + Socc[pos-1], 也就是序列中在pos前面应该有jump个空位置和Socc[pos-1]个已占位置. 整理得到 pos - Socc[pos-1]= jump. 注意到pos - Socc[pos-1]是一个关于pos非严格单调的函数, 而且最终的正确答案只有1个,因此二分即可得到.

当然, 我觉得这题使用"计数线段树"也不错, 初始化所有节点都满cnt,然后也是从最后一个人开始处理, 每次在树中找到第jump+1小的数pos, 插入到序列中的pos位置, 然后把树中pos位置置为0. (路径上cnt均-1即可)

第三题, 给一棵有根树, 每个节点有一定量的苹果, 从根开始走K步, 每走到一个节点可以取走这里所有的苹果, 问最多能拿到多少苹果?

结点数N <= 100, K<= 200, 每个节点苹果数 <= 1001.

不会. QvQ

一个不太成熟的想法是, 用dp[i][k]表示到节点i, 已经走k步, 能拿到的最大苹果数量. 然后记忆化搜索. 但不知道怎么递推. 从N的规模看记录各节点是否已经拿到是不可能的. 那怎么搞呢? 目前没有进一步想法.

第四题, 给一张有向图, 每条边有2个费用值. 对于每条边, 如果已经到过了某个城市, 则可以花费较小的那个费用来过路, 否则要用较大的那个费用. 求1到N的最小费用.

节点数N, 边数M <= 10

10...这个可以随便乱搞...于是我就直接dfs就过了...加了一个限制, 每条边至多经过20次, 我也不知道没有这个限制能不能过-_-

第五题, 又是填空题, 填一个后缀数组的模板, 然后求N个长为60的子串中都出现的最长公共子串.

N <= 10

又是10...于是我果断地自己写了一个5行的n^2 * logn的暴力方法解决了求后缀数组模板的问题...

然后就不难了, 二分长度len, 验证len时, 对于height数组找出连续的最小值不小于len的区间, 从前往后扫一遍, 同时在每个连续区间内统计当前名次对应位置在哪个子串, 记录下各个子串是否出现. 如果有某个时刻所有子串都出现则ok, 否则不ok.

第六题, 给平面上N个点, 求每个点到离它最近的点的距离.

N <= 100000, 0 <= 坐标 <= 10^9

这题科学的方法应该是用KD树, 但我不会. TvT 于是只能暴力. 然后暴力居然WA了(我期待的是TLE...),然后我也不知道问题出在哪里. (我有注意用long long)

反正如果要用暴力, 我的思路应该是没什么问题的.先把所有点按照x坐标排序, 然后从左到右访问各个点, 每个点访问它右边的所有点, 求出最短距离(同时要维护右边各个点的最短距离, 因为右边不会再回来访问左边). 然后因为已经对x排序, 因此可以加一个剪枝: 如果右侧点与当前点x坐标之差已经大于当前节点最短距离, 则直接忽略该右侧点及其后面的点.

啊! 然后我好像发现一些问题...

如果是这样: (0, 0), (1, 1),(1000, 1000), 那么我搜(0, 0)的时候会维护(1, 1)的距离, 然后往右发现x坐标差已经超标, 因此不访问(1000, 1000). (1, 1)再往右询问也发现x坐标差过大, 所以也不去访问(1000, 1000), 所以(1000, 1000)里面存储的最短距离是无穷......

唉...所以思路需要这么改一下: 每个点都需要访问从左到右所有的点(当然, 自己除外), 然后维护最小值. 剪枝方法仍然使用. 还有一个剪枝, 就是不是从左到右, 而是从当前节点向两侧搜索, 这样(应该)能尽快地搜到最短距离, 也能更快地剪枝.

但据说这样还是会TLE的, 而且据说不按照x排序而是按照y排序就能过了O_O 果然会被出数据的人卡...当然, 我的室友采取了一种按照x+y排序的方法, 这个很难被卡(不好想到), 值得学习一个...

总而言之, 最后一题得到1分样例分, 第3题没做, 其他都过了, 得到多达41分QvQ. 如果当时最后一题能够找到问题, 应该还能多得不少分的. 不过现在的结果也还好.

然后就是数算的机考了...

第一题, 给一个括号序列, 有小中大括号, 问这个序列是否括号匹配 (每一对括号里都不存在不能匹配的括号)

做法不难, 直接开一个栈, 遍历序列, 左括号则进栈, 右括号判断是否与栈顶一致,不一致直接false, 否则弹掉栈顶. 最后栈空则true, 否则false.

然而这是我考完试人家告诉我的......唉, 我的方法虽然也过了, 但觉得很蠢.

我的方法是, 开三个变量c1, c2,c3, 分别保存当前左小括号, 左中括号, 左大括号的数量. 并且为每个变量开一个栈. 每次读到一个左括号, 就把这个括号对应数量+1, 其他括号数量压栈并暂时归零. 每次读到右括号, 则要求这个括号计数>0, 另外两个括号计数==0, 否则就有错. 没有错的话, 把这个括号数量-1, 然后其他括号数量弹栈. 有点像递归转非递归的感觉. 反正思路就是判断每个括号里是否有不匹配, 而且进入内层括号时要保存外层括号的数量. 但跟正确方法比起来实在是非常呵呵.....这个我写了2K多...

第二题, 维护一个大小为M的内存区域, 连续N次操作, 每次给一个数, 如果这个数已经在内存中则不作修改, 否则将这个数插入到内存区域当中. 如果内存区域已满, 则踢掉最早插入的, 然后再插入新的数.

N, M <= 1000000, 每个给出的数 <=1000000

这个就直接开一个队列即可, 同时维护一个bool数组记录所有的数是否存在.

第三题, 求传递闭包... N<= 300

看见这个N的规模我还是有点虚的, 毕竟300^3 = 2700万, 限时是1s. 不过好在他并没有卡, 还是直接Floyd就过了.

第四题, 有一队人共N个, 从前往后给出每个人的速度,求会发生多少次超越. (后面的速度比前面快就能超越)

这个就是求序列的"顺序对", 而且是"严格顺序对", 因为每次前面小于后面就对应一次超越. 如果要用原来做过的求逆序对, 再用总对数减去它, 则要注意相等的情况. 相等的也要算到"逆序对"里面, 否则就错了.

第五题, 求一个有向图是否有环.

点数N <= 100000, 边数M <=500000

这个问题在原来的书面作业里出现过. 方法就是类似拓扑排序, 不过可以从任何未经过的点出发, 因为如果一个点通向任何环, 那么从它出发必然求得环; 如果一个点不通向任何环里, 那么把它能够达到的点全部置为"已访问"(将来不再访问, 相当于从图中删去)不会影响环的有无. 而且要保证最后所有点都访问过. 如果最后仍没有环, 那就确认图中没有环.

第六题, 坑爹填空题...给一个字符串(长为N)和一个模式(长为M), 给出Q个询问, 每次询问一个数x, 求字符串中有多少个位置和模式能够匹配上的最大长度恰好等于x.

给的算法是KMP, 但是对于next数组的利用比较巧妙, 不好想.(其实我现在也没想清楚QvQ,是别人告诉我的) 除去模板部分不说, 大体思路是对于x = 1~M, 求出匹配长度 >= x的位置数量, 然后差分得到答案. 匹配长度>= x的怎么求呢? 先做一次模式匹配, 求出每个位置i的前向最大匹配长度, 这个是易于计算的(匹配过程中, 匹配完i这里的时候, 模式中的下标就是前向匹配长度). 然后先在数组cnt中统计一下所有x在f[i]中出现的次数, 也就是有多少个位置的前向最大匹配长度恰好等于x. 然后有一个非常神奇的处理, 让i从N递减到1, 每次cnt[next[i]] += cnt[i], 得到的cnt数组就是我们要求的, 即cnt[x] = 后向匹配长度 >= x的位置数量. 这是为啥呢? .................大概就是, 对于一个前向匹配长度为L的位置, 它一定对应一个后向匹配长度>=L的位置; 与此同时, 还会对应一个后向匹配长度>=next[L]的位置, 还会对应一个后向匹配长度>=next[next[L]]的位置...以此类推. 因此这样的操作相当于是把前向匹配长度为L的位置数量加到了后向匹配长度为L(不用加), next[L], next[next[L]], ...的数量上. 只需证明这样的统计是不重不漏的. 对于cnt[x], 代表后向匹配长度 >= x 的位置数. 对于每个后向匹配 >= x的位置, 都一定是由这个位置+x的那个位置的对应过来, 让cnt[x]++的. 各个位置+x的位置显然是不同的, 因此统计不重. 不漏的话, 对于如果位置i开始的最长匹配是L, 则它应该被统计到所有x <= L 的cnt[x]当中去. 对于位置i+x, 如果最长的前向匹配是x, 那么正好对应到i, 统计正确. 如果最长前向匹配不是x, 那么一定 >= x (因为i的最长后向匹配是L保证了i+x的前向匹配至少是x), 设为X. 那么x一定是next[X], next[next[X]], ...这个序列当中的. 理由的话, 可以想象两个序列, 均以i+x结尾, 一个长为X, 一个长为x, 这两个都能与模式匹配上, 那么长为X的前x个字符必然与后x个字符相等, 所以x一定在X的next序列上. 所以根据之前说的操作, 对于位置i+x的前向匹配长度X, 要在后向匹配计数中, 对于X的next序列中的所有长度值x, 都要cnt[x]++, 也能够统计上i位置. 因此对于任何的i+x都能将i统计到cnt[x]当中去, 因此不漏.

啊, 好麻烦...我也是一边写一边想, 能想得大概, 但也只是个大概而已. 而且我保证我在考场上决想不到这玩艺...不过室友表示, 由于填空是

<span style="font-size:24px;"> for (int i = m; i; i--) _____(5)_____ +=cnt[i];</span>

从上下文看, 这空里似乎只能填cnt数组, 而且下标肯定是某个小于i的东西. 验证发现i-1是不对的, 于是就试next[i], 过了......

合情合理. -_-

不过这题我考场上想不出来, 又不想干等死, 咋办呢? 于是我就写了后缀数组-_-反正前两天数算实习机考要求后缀数组, 虽然那道题被我水过去了, 但正经的模板我还是会的. 然后用后缀数组这题很简单, 把原串和模式拼起来求SA, 在height数组里找到整个模式对应的名次, 然后往前一路搜, 每次把当前匹配长度和当前height值取小, 然后统计到cnt当中. 往后也搜一边. 原理就是, height数组里离模式越近的匹配长度肯定越大, 越远就越小, 而且与模式的公共前缀正好就是最长匹配长度. 然后居然只写出了少许BUG, 调了一小会就过了...

第七题, 给N个商品, 每个商品有利润和保质期, 保质期以天为单位, 而从第1天开始每天只能卖一件货物,问最大利润.

N,利润,保质期 <=10000

这题我认为是个idea题...不太好想. 反正先想简单贪心, 每天就卖这天最贵的, 有何不妥呢? 如果有1个1,1, 然后有两个2,100, 就错了. 第一天应该卖2,100而不是1,1. 因此第一天似乎并不能确定卖什么. 然后就从后面想, 最后一天(设为maxt)卖什么? 第maxt天肯定卖保质期为maxt的最贵的那个, 因为其他的都过期了. 这个确定了之后, 那maxt-1天卖什么? 肯定卖保质maxt-1天的以及maxt天剩下的(已经确定卖了1件)那些里面最贵的, 因为其他的都过期了, 而且也不会影响以后, 因为以后的计划已经确定了. 以此类推, 第t天就应该卖那些保质t天以上, 而且剩下的(不在t+1到maxt天的销售计划中的), 最贵的那个. 然后就好办了. 先把保质期同为t的商品都放在同一个vector里面, 然后从t = maxt天开始, 把保质期 == t的那个vector中的所有利润值扔到一个最大堆里, 然后找出堆顶, 弹出并记录利润, 然后t--. 再把保质期为t的也扔到这个堆里, 弹出最大值. 循环到1, 即可.

总而言之, 虽然有些题有些侥幸, 有些题有些蠢(因而更需要侥幸QvQ), 反正还是AK了...以及发现KMP(next数组)果然还是一个很有学问的东西...虽然AK了, 但以后还要继续努力提高姿势水平QvQ

数算实习+数算 机考总结……相关推荐

  1. 电子科大信软互+班 程算I 2022级机考真题

    基本情况 对应课程:程序设计与算法基础I 考试时间:3小时 题型:函数题+编程题 函数题只需要完成期中一些(个)函数即可 编程题需要自己手动写main函数 说明:题目从icoding看的,不确定是不是 ...

  2. 电子科大信软互+班 程算I 2021机考真题

    基本情况 对应课程:程序设计与算法基础I 考试时间:3小时 题型:函数题+编程题 函数题只需要完成期中一些(个)函数即可 编程题需要自己手动写main函数 提示:题目序号为x-x的可能为一组题目,若题 ...

  3. 电子科大信软互+班 程算II 2021机考真题(含答案)

    目录 基本情况 具体题目 1 线性表1 2 线性表2 3 栈 4 二叉树 5 树 6 图 7 排序 自我练习 声明 基本情况 对应课程:程序设计与算法基础II(数据结构与算法基础) 考试时间:3小时 ...

  4. 电子科大信软互+班 程算I 2020机考真题

    基本情况 对应课程:程序设计与算法基础I 考试时间:3小时 题型:函数题+编程题 函数题只需要完成期中一些(个)函数即可 编程题需要自己手动写main函数 提示:题目序号为x-x的为一组题目,若题目告 ...

  5. 高数计算机软件,扫一扫题目就能算高数!一款大学必备的高数神器

    [PConline 应用]不知不觉到了开学季,已经有很多朋友迎来了大学的新生活,而不少学生读者也将会第一次接触那颗挂了很多人的树--高数.高数难不难?平心而论,用心学的话并不算特别难,但首次接触出现不 ...

  6. php 阅读量 怎么计算,微信阅读数和点赞数怎么算

    微信公众号文章公开了阅读数和点赞数,那它们是怎么算出来的呢?昨天测试了一下用pc端浏览器打开刷新多次,然后再用手机端看数字有没变化,结果貌似不行,看来微信团队早就想到这点了.那我们一起来看看有哪些方式 ...

  7. decimal类型怎么算字节数

    相比于float,double类型,decimal类型属于精确类型,不会丢失精度,所以只要涉及到金钱,财务相关的数据,对应的类型一定要选择decimal. 那么decimal类型怎么算字节数,怎么看支 ...

  8. 100999凑整到万位进一_【小学奥数题库系统】1-1-1-1 整数加减法速算与巧算.教师版...

    另一个数的"补数". 2.加补凑整法.有些算式中直接凑整不明显,这时可"借数"或"拆数"凑整. 3.数值原理法.先把加在一起为整十.整百.整 ...

  9. 华为软件类校招 2014年9月3日 熟悉机考环境 1.记票统计 2.求最大递增数 3.Word Maze(单词迷宫)

    (样题,已对外公布)记票统计 描述: 模拟n个人参加选举的过程,并输出选举结果:假设候选人有四人,分别用"A"."B"."C"." ...

最新文章

  1. php rfc3986规范,「PSR 规范」PSR-7 HTTP 消息接口规范
  2. php多个域名301重定向到主域名代码,Nginx 301和apache重定向域名规则方法(多个域名,单个域名)...
  3. 数据不平衡的解决办法
  4. 第十六届全国大学智能车竞赛东北赛区报名信息统计
  5. 基于Selenium2与Python自动化测试环境搭建
  6. java工单自动化流程控件,一种工单审批的自动化处理方法及系统与流程
  7. Thumbnailator-图片处理的Google开源Java类库
  8. [BZOJ3932][CQOI2015]任务查询系统(差分+主席树)
  9. .NET Core 2.1中的HttpClientFactory最佳实践
  10. edge浏览器怎么恢复默认设置 edge恢复默认设置方法
  11. Windows编程—杀死指定路径程序文件的进程
  12. 【干货】无人机如何进行倾斜摄影的航线规划
  13. 拖拽图片到另一个div里
  14. GetData Graph Digitizer软件的使用方法
  15. 性别为什么不适合建立索引-值重复率高的字段不适合建索引
  16. 红旗h5中控台恢复出厂设置后不显示倒车影像问题
  17. 服务器win10系统开机慢,Win10系统更新后开机变得很慢的解决方法
  18. antd select.option选项加入额外属性
  19. 在线表单工具哪个好?
  20. Windows系统怎样配置PHP环境

热门文章

  1. 【笔记】vue实现音乐播放器
  2. 用python从零开始写一个注册机(新手也能操作)-前言
  3. 5.8日, 服务器青龙面板拉ksjsb脚本教程~
  4. GT Designer3触摸屏上传
  5. 2.2 法学的历史(二):中国法学的历史
  6. html超级玛丽游戏源码,超级玛丽HTML5源代码学习------(一)
  7. 自适应滤波器2-维纳滤波器-误差性能曲面
  8. 基于ES的HBase二级索引方案
  9. snort安装--daq,dnet---ERROR! dnet header not found, go get it from...等错误解决方案
  10. 高一信息技术课件python编程_教科版高中信息技术选修第一章第三节Python入门--奇妙曲线的绘制 课件(22张ppt) 教案 (2份打包)...