CSDN 编程竞赛四十三期题解

竞赛总览

CSDN 编程竞赛四十三期:比赛详情 (csdn.net)

竞赛题解

题目1、判断胜负

已知两个字符串A、B。连续进行读入n次,每次读入的字符串都为A或B。输出读入次数最多的字符串。

这道题目本身不难,遇到字符串就给它的计数+1。

由于只有两个字符串,所以简单地记录一下第一个出现的字符串即可。当遇到新的字符串时,如果和首个字符串一致,则更新计数器A,否则,更新计数器B、

不过,如果有多个字符串呢?这时候该怎么处理?

博主在这里给出一个思路,感兴趣的小伙伴可以自己动手尝试一下。

首先,用一个数组记录出现过的字符串,并开辟另一个数组作为计数器,用于统计对应字符串出现次数。也可以直接用一个结构体,存储字符串内容和其出现的次数,这样只需要开辟一个数组即可。

遇到新字符串时,检查数组中有没有一致的。如果有,则更新对应的计数器。否则,将新遇到的字符串存入数组尾部,设置计数器的值为1,表示字符串出现了1次。

这个题应该算是本次竞赛最简单的题目了,包括初学者在内,大部分人应该都可以通过。

题目2、小豚鼠搬家

小豚鼠排排坐。小艺酱买了一排排格子的小房子n*m,她想让k只小豚鼠每只小豚鼠都有自己的房子。但是为了不浪费空间,她想要小房子的最外圈尽量每行每列都有一只小豚鼠居住(小豚鼠也可以住在中间的格子,只需保证房子最外围的行和列至少住一只豚鼠即可,无需每行每列都有豚鼠)。小艺酱想知道自己有多少种方案安排小豚鼠。

使用深度搜索法,尝试将小豚鼠安排到各个位置中去。

当小豚鼠全部被安排好之后,即可产生一组方案,此时对方案进行校验。如果满足题目要求,说明这种方案合理,此时立即更新计数器。

搜索完成之后,即可得到可行的方案总数。

题目3、醉酒的狱卒

某监狱有一个由n个牢房组成的大厅,每个牢房紧挨着。每个牢房里都有一个囚犯,每个牢房都是锁着的。一天晚上,狱卒感到无聊,决定玩一个游戏。在第一轮,他喝了一杯威士忌,然后跑下大厅,打开每个牢房的锁。在第二轮比赛中,他喝了一杯威士忌,然后跑下大厅,锁上每隔一个的牢房的锁(牢房2、4、6....)。在第三轮比赛中,他喝了一杯威士忌,然后跑下大厅。他每隔三个牢房(第3、6、9号牢房)就去一次。如果牢房被锁上了,他就把它打开;如果牢房门打开了,他就锁上牢房。他重复n轮,喝最后一杯,然后昏倒。一些囚犯(可能为零号)意识到他们的牢房被解锁且狱卒丧失了行动能力,他们就可以立即逃跑。现在根据牢房数量,确定有多少囚犯越狱。

这道题目的描述比较长,但是并不难,只要耐心读完题,稍加分析,即可找出其中的规律。

首先,初始状态下所有房间都上锁了,但狱卒会在第一轮打开所有房间的锁。也就是说,我们只需要从第二回合开始处理即可,此时所有房间都未上锁。

之后使用模拟法,对每一个房间单独进行判断,得到对锁操作的次数。如果这个次数是偶数,加锁与解锁操作就可以全部抵消,此房间中的囚犯可以出去;否则,囚犯被锁住,无法出去。

扫描全部房间之后,即可统计出囚犯越狱数量。

题目4、会议安排

开会了!作为一个集体,开会的时候桌子当然是需要和老大相邻的(老大可能坐在桌子上边)!小艺被分配到排桌椅的活,可是小艺的力气都用在吃上了,怎么可能搬动这些桌椅呢。她决定用现有的布局当作是会议座位安排。每个桌子分配一个人,相邻桌子不同的桌子颜色不同。小艺想知道选择某个桌子之后老大身边能围多少人?

这道题目在第20期竞赛时做过,考虑到答案的范围并不是很大,当时直接骗分过的。

很巧的是,本期竞赛前一周,有一些阅读文章新增的粉丝。博主会读一读这些粉丝看过的文章,顺便看一下对应的代码。结果这次又出来这道题了……

博主发现有些题目虽然出现过多次,但确实做了一些优化,例如醉酒的狱卒这道题,描述多了几个字:可能为零号。

所以,这里也顺便提一个建议。如果题目在后续竞赛中还会重复出现,测试数据可以适当更新一下(例如使用数据生成器,为每道题生成一定比例的新数据)。之前某几期竞赛时候偶现数据出错的情况,如果每次都能生成新的数据,能够在一定程度上减少这种情况发生的概率。

猜你喜欢

转载自blog.csdn.net/x1051496412/article/details/130035666