第14次CSP认证考试总结

 |
总阅读量


  学而不思则罔,思而不学则殆。不会反思自己的人思想总是不会太深刻,而太过沉溺于幻想之中只会徒增失落。低头前进,全凭一身锐气,不撞南墙不回头;不如与知音进行一次彻夜长谈,回顾过去,展望未来。目极远眺,若许人或在招手。

  回顾整场考试,节奏把握的还是不错的。但其中的三大问题,令人唏嘘:

* 1.第二题没有仔细分析条件,再加上给的样例,直接将思想带偏到了预定的方向;
* 2.第三题题目比较长,在看题的时候没有标注一个重要条件,导致在写代码时将其忽略;
* 3.心里没有B Tree,幻想着能在第四,五题得一些分(竟然不是把在一个小时内将4,5题
*  做出来,看来也不是没有B Tree)。

下面展开进行分析,

第二题

问题描述
试题编号:
201809-2
试题名称:
买菜
时间限制:
1.0s
内存限制:
256.0MB
问题描述:
问题描述
  小H和小W来到了一条街上,两人分开买菜,他们买菜的过程可以描述为,
    去店里买一些菜然后去旁边的一个广场把菜装上车,两人都要买n种菜,
    所以也都要装n次车。具体的,
    对于小H来说有n个不相交的时间段[a1,b1],[a2,b2]...[an,bn]在装车,
    对于小W来说有n个不相交的时间段[c1,d1],[c2,d2]...[cn,dn]在装车。
    其中,一个时间段[s, t]表示的是从时刻s到时刻t这段时间,时长为t-s。
  由于他们是好朋友,他们都在广场上装车的时候会聊天,他们想知道他们可以聊多长时间。
输入格式
  输入的第一行包含一个正整数n,表示时间段的数量。
  接下来n行每行两个数ai,bi,描述小H的各个装车的时间段。
  接下来n行每行两个数ci,di,描述小W的各个装车的时间段。
输出格式
  输出一行,一个正整数,表示两人可以聊多长时间。
样例输入
4
1 3
5 6
9 13
14 15
2 4
5 7
10 11
13 14
样例输出
3
数据规模和约定
  对于所有的评测用例,1 ≤ n ≤ 2000, ai < bi < ai+1,ci < di < ci+1,
    对于所有的i(1 ≤ i ≤ n)有,1 ≤ ai, bi, ci, di ≤ 1000000。

关注数据规模和约定这一句

ai < bi < ai+1,ci < di < ci+1

当时的我处在看完样例之后再看这个条件,而且是在我已经有思路的情况下,于是顺理成章的没有认认真真、仔仔细细地再去分析这个条件,按照错误的思路写出了错误的只过了样例的代码,本来还想再造一些样例的,但是此时信心爆棚的我哪还有心思…事后和室友聊了一下,听他用了两个队列做的(我此时心里是带一点慌的),我向他解释我的方法,而且我着重向他介绍我没有认认真真、仔仔细细分析过的那个条件。如果没有这个条件,那么我的思路就是错的,但是由于当时没有题面,语言表述又有限,便作罢…过了两天出成绩,冲动的惩罚来了——只得了样例的分,而此时的我竟然还没有意识到错误解读条件…看来我还挺偏执…
所以考试的时候没有仔仔细细的分析条件,那就只能下来分析了,晚矣晚矣~

ai < bi < ai+1,ci < di < ci+1

分析一下,也就是数据规格符合逻辑而已,输入的小H、小W休息时间分别不会重叠。满分代码已我放在我的Github

第三题

题面比较长,就不搬来了,链接,其中有个条件:id属性大小写不敏感,coding时的确忘了这个条件,得了80分…不得不说运气还挺好…
在这里记录一下解决这道题中 后代选择器的思路:

* 第一步,用一个数组记录每一行文档的**层级**(累加每一行文档前面“.”的个数)。
* 第二步,将要查询的标签解析分开存在一个vector里,遍历查找vector中每一个标签,
* 查找算法步骤如下:
    * 第一步,按照解析后的标签的层级从低到高,开始在文档中查找;
    * 第二步,每次查找遵循贪心原则,只保存找到的标签的最大的层级数,找到则进
    * 行下一步,没找到查找结束;
    * 第三步,继续查找下一层标签,但是找到的最大的标签的层数必须是小于上一层
    * 找到的标签层数,如是往复。    


**题目给的提示绝对是很重要的。贪心,是个好算法。**

  一瞬间的失神,可能决定着沧海桑田,望三思而后行。


雪林于

抛砖引玉 亦或 他山之石,可以攻玉。