一转眼,周赛都举办了60期了?还以为可以“寿终正寝”了,结果61期又安排上了。打开一看,还是《计算之魂》主题的周赛,还是这种 4 (非编程) + 2 (编程) 的题型。可能目前就指望着《计算之魂》“主持大局”了,C 站的有生力量全扑在研发、开发各种各样酷炫的功能上去了吧。
反正只管挖坑,已存在的问题视而不见,这样能搞好才怪。
本期 4 道非选择题全都出自《计算之魂》的第 2 章、第 4 节。该节的标题写得明明白白:
“嵌套”两个字都写进标题了,结果其中一道选择题的答案却是递归:
又搁这儿玩文字游戏呢?
得了,不纠结,爱咋咋地。
两道编程题也是一言难尽。
贝博士的论文审阅统计
贝博士经常收到申请他审阅论文的信函,每封信函的信封上面只有两个申请人的编号,且每个申请人只能申请审阅一篇论文,但可以重复申请。贝博士请艾小姐根据信封上的申请人编号统计下:一共有多少篇论文要审阅,最多申请人的论文有多少人申请?
这表达能力,不看示例基本读不懂。然后看了眼示例:
输入:
6 3
1 2
1 3
4 5
输出:
3 3
更迷茫了。
什么鬼?
从输入的数据来看,很像之前做过的蚂蚁家族、交际圈等并查集的题目。两个数字表示的是两个节点之间存在一条边,再联想到前面的题目描述,可能是说明这两个申请人申请的是同一篇论文。按照这个道理分析的话,6 和 3 是同一篇论文,1 和 2 是同一篇论文,1 和 3 是同一篇论文,这时因为 1 和 2、6 和 3 也是同一篇论文,所以,1、2、3、6 都是同一篇论文;最后 4 和 5 是一篇论文,所以答案应该是 2 (篇论文)和 4 (个申请人最多申请)。可正确答案却是 3 和 3 ?
想破脑袋也猜不出这个答案怎么来的。题目没有作更多解释,最终本题也是没人得分。
读题体验差一直都是 C 站特色,不用纠结,嗯。
括号匹配
有四种括号:大括号{}、中括号[]、小括号()和尖括号<>。它们之间不能错套,且需要配对。 错套的意思是:某种括号的前半部分和后半部分之间,仅套着不同类括号的某一半部分而没有另一半部分。错套的样例如下: >{> ([hello[]]}){world} 因为在尖括号的前半部分和后半部分之间,仅套着大括号的前半部分而没有后半部分。 配对的意思是:如果出现了某种括号的前半部分,则必须在之后有同样数量的同类括号的后半部分与之对应;反之如果出现了某种括 号的后半部分,则必须在之前有同样数量的同类括号的前半部分与之对应。正确的配对样例如下: >> ({[hello[]]}){world} 错误的配对样例如下: ))>([hello[]]){world} 因为前2小括号只有后半部分而缺失了前半部分,而尖括号的前半部分有3个,而后半部分只有2个。
关于多种括号嵌套的题目以及各种变体,在各大刷题网站已经考得非常多了,绕不开栈结构的运用。可以说,只要学过栈,应该都做过关于括号嵌套的题目。
本题的出题人也是想着推陈出新,在原本合法与非法(错配)的嵌套括号的基础上,增加了一种“错套”类型。结果弄巧成拙,蹩脚的中文描述并未描述清楚这种类型到底是什么样子的,而且可以看出,出题人并没有考虑得十分全面:
- 对于形如 的嵌套括号,在什么情况下理解成“错套”,什么情况下理解成“错配”呢?因为这种情况同样可以解释成“少了一个右大括号”。
- 对于形如 的嵌套括号,是应该理解成“错套”吗?题目给的“错套”的定义为某种括号的前半部分和后半部分之间,仅套着不同类括号的某一半部分而没有另一半部分。按照这个定义,这种情况也应该可以被解释成“错套”,因为它只包含了右大括号。
- 对于“错套”的情况,要输入第一次出现“错套”位置前后的括号,然后加上一个感叹号(!)。比如 的情况,就要输出 。问题来了,这个“位置前后”需要字符串相连吗?比如,如果是 ,该如何输出?
对上述情况,题目并未说明,根据多次试错,可以了解到相应的答案,或者说本题用例使用的细则如下:
- 只有当嵌套括号中的括号是左半边时,才是“错套”,也就是说,只有 是错套,
- 而 是错配,即“少了一个左大括号”。
- 输出的字符要跳过错套位置前后括号中间的字符,比如 ,输出 。
嵌套括号的栈结构本身没什么好讲的,实在太基础了。但只有了解了这些“潜规则”,才有可能通过此题。
题目还算是有创意,毕竟出题人也是想着老瓶新酒、推陈出新,但若是把题目描述写得更清楚一些、考虑的情况更全面一些,将会更好。
当局者迷旁观者清,从一开始就建议 C 站增加审题的人手,先保证大多数人对题目的理解不会出现大的歧义或错误才正式拿来当赛题,但是 60 期了,毫无改进。
罢了,等主题周赛搞完,没有赞助了,到时既没钱也没人手,该项目真的可以考虑“寿终正寝”了。