emmmmm大致题意就是给你连续的n个格子,编号1到n,开始所有的格子都是空的,两个人轮流往空格子里放字母s或者o,谁先使得相邻的三个格子里字母为sos则谁获胜,假设A先手,B后手问谁会赢,如果所有格子都被填满了但是没有出现sos则认为两人平局。
思路:
一开始看到这题本来我想用状压啊,sg函数啊什么的去写,但是gg,于是就先扔一旁了,后来卡题的时候看榜单发现有一些奇奇怪怪的队伍过了这题,于是就觉得这题会不会是个傻逼题,然后对着样例自己和自己下,发现如果此时格局为S _ _ S时,谁先手谁必输,所以如果当前先手能赢,那么必定是要去构造这样的情况,然后留给后手。样例很给力呀,已经把最基本的情况给我们了,当格子数为7的时候,先手第一步在4号格子放s,接下来不论对方怎么弄,先手都能构造出一个S _ _ S的情况留给对方,所以先手必胜,小于7的格子数,必定是平局。 接下来慢慢增加格子的数量,不难发现,当格子数为偶数时,先手不能取胜,所以我们尽量去打平局的情况(当时推了一下前面的偶数情况先手都能打平然后就没再考虑了。。背锅),但如果是奇数,先手还是在最中间的位置放个s,然后局面就分成了左半部和右半部,然后接下来一定能构造出一个S _ _ S的局面并且满足剩余空格子的数量为偶数且轮到对方走,那么最后留给对方的一定是一个S _ _ S局面,所以先手必胜。当时想到这里我就控制不住自己了然后猜了一下偶数平局,奇数先手赢,上去敲了一发,然后就wa了。。。冷静下来后想想,格子数量多了怎么可能后手不会赢,而且如果就这样简单的话应该已经榜切了呀。。。。于是又开始找后手获胜的情况,那么只能是格子数是偶数的时候啦,所以当格子数增加到一定数量为且偶数的时候后手赢,那么我们需要找的就是这样一个临界点。当格子数为偶数,可以分成左右两个相同的部分,如果先手制造出了一个S _ _ S的情况,那么后手也可以制造出一个,所以先手不可能赢,那么先手就得去尽量打平了,也就是说尽量多放 o使得S _ _ S 的情况不出现。不难发现当一半边的格子数大于7时,后手一定能制造出一个S _ _ S的情况。(这里需要注意的是当半边格子数等于7时,只要先手在7号位置放置一个O,那么后手就不能在8号位置放S了,然后每当后手放置一个S,先手都能放置一个O在相对应的位置去破坏后手想要构造的S _ _ S情况。好多队伍第一发都是找的14。。。)
所以临界值即为16。当n大于等于16时,奇数先手赢,偶数后手赢。当n小于16时,奇数先手赢,偶数平局。
当时改了交后还觉得自己会错,然后还在考虑怎么用正常的方法去写,结果队友一拍我大腿兴奋的说过了,当时我也是一脸懵逼,这题就这么过了?emmm。。。。当时内心就想,感觉没刷过博弈论专题的队伍写这题还是有优势的,两个队友下下棋找找规律就过了。。。。
后来比赛结束发现学弟们也过了这题。。。赛后问了下,他们说没刷过博弈论相关的题,就两个人下了会棋找找规律就过了。。。。