10.1 国庆假期打卡(1/2)
今天做了队列和一道排序
1333 Blah数集
明面上这道题有一个序列(升序的Blah数列),即我们要求的序列
实际上,还有两个隐式的序列
分别是Blah数列的元素按照两个规则算出来形成的两个数列(2 3)
这两个数列分别是有序的,并且长度和Blah相等(动态的看)
但实际上Blah包含这两个序列
用两个指针分别指向 2 3数列
最开始Blah数列只有基数a时,2序列和3序列都只有一个数(2:2a 1 3:3a 1)
显然,这时两个指针指向的数都比a大
要求Blah的升序,则a的下一个元素一定是2指针指向的数
然后Blah多了一个元素,再递归地把它视作a
2和3序列分别增加一个元素
这时2序列的指针和a不满足升序,2的指针上移一位
有点归并的感觉
1334围圈报数
是约瑟夫环的变式
方法:用绝对位置储存每个人的编号,即从程序开始到结束,每个人在内存中的位置是不变的
所以会有标记数组来判断这个人是否已经出队
最朴素的方法:逐个遍历。即用i表示本次报数的人的编号。不断地寻找下一个还在队内的人
直到报数的计数到了指定值,把这个人输出并出队,往后寻找下一个人,从他开始报数,不断循环
直到队列人数为零退出循环
这道题用余数压缩会比较麻烦,涉及到抽象队列和内存中实际队列的编号处理
1361产生数
题本身比较简单,用BFS加哈希判重就可以了
这里对映射的储存用了一个比较巧的数据结构,有点类似查询哈希表(不如说就是照着它设计的)
得益于这个数据结构这道题做起来比较简单,只要把映射理解好就可以了
犯的错误改正:对于扩展的状态,要在哈希表中不存在时才加入队列






