FOJ有奖月赛-2015年10月 比赛链接: here 注意此乃非官方题解,只是个人解法,如有不对,敬请指出。 A题: 题目链接:http://acm.fzu.edu.cn/problem.php?pid=2198 很水,一看就是写递推式,然后矩阵递推。 递推式为 t[n] = 6*t[n-1] - t[n-2]. 然后对t[n]从1~n求和。 所以需要3*3的矩阵。 然后快速敲完,非常遗憾,TLE了。。。。 怎么办????? 暴力打一些表,然后飘过~~~ 为何要卡矩阵乘法!!!!!! 代码君:
1 | /* *************** |
B题: 题目链接:http://acm.fzu.edu.cn/problem.php?pid=2199 本场比赛的压轴题,比赛期间无人AC,因为中间题目不清,改题意了,我是赛后改了下才AC的。 题目要求一口气吃完所以萝卜。 就是你从起点开始,可以先不吃萝卜,一旦碰到萝卜,就要一直吃完,然后走到洞口走人。 所以你首先枚举第一个吃到的是哪个萝卜! 从起点进行一遍bfs, 就是知道从起点可以到哪个萝卜了,距离和种数都知道了。 假如吃萝卜的起点和终点都确定了,就是单路径问题。 非常裸的插头DP就可以解决。 插头DP参考:here 我是按照ZOJ3213代码进行修改的,而且简化了,因为起点和终点都确定了。 走的距离其实可以不用记录的,我一开始理解错 了,加了记录,后面发现没有必要。 代码君:
1 | /* *************** |
C题: 题目链接:http://acm.fzu.edu.cn/problem.php?pid=2200 题目讲得很清楚了,但是因为是个环! 如果是线性的,比较好办,直接DP。 环的换,就枚举前两个点,这样就分割成了一个线性的,然后进行DP。 DP的时候,我记录了最前面的状态,以及结束的状态 。转移非常裸。 这题思路和G类似了。
1 | /* *************** |
D题: 题目链接:http://acm.fzu.edu.cn/problem.php?pid=2201 非常显然要用数据结构! 怎么维护呢? 关键就是第一个操作了。 如何求 gcd(c-a,c-b) ? 可以发现是 gcd(c-a,c-b) = gcd(c-a,a-b). 如果有很多数呢? 如何求 gcd(c-a[1], c-a[2], …. c-a[n]) ? 可以发现是这样的 gcd(c-a[1], a[1]-a[2], …. a[n-1]-a[n]) 发现就是差分和其中一个数了。 所以用线段树搞,记录第一个和最后一个就可以维护差分了, 然后GCD就出来了。 本题我int就不过了,没有上long long….. 数据范围比较小吧。 英神教我的,英神果然牛逼!。
1 | /* *************** |
E题: 题目链接:http://acm.fzu.edu.cn/problem.php?pid=2202 题目也很清楚,最后要输出每个人是不是可以确定说真话还是假话。 首先枚举,加上第 i 个人犯罪了,那么你要判断是不是说真话的有m个。 判断的时候肯定要 O(1) 啦, 其实如果i是犯罪的,说别人犯罪的都是说假话的,说别人不犯罪的也是假话的,直接就求出了有多少人说真话。 然后输出时候特判就可以了。 具体不分析了,自己看看代码。 代码君:
1 | /* *************** |
F题: 题目链接:[http://acm.fzu.edu.cn/problem.php?pid=2203](http://acm.fzu.edu.cn/problem.php?pid=2203) 很水。全场最水。 二分,然后判断就可以了。
1 | /* *************** |
G题: 题目链接:http://acm.fzu.edu.cn/problem.php?pid=2204 要对n个点的环进行黑白染色,没有>=7个连续的都是黑或者白。 一样的思路,环转化为线性。 假设第一个是黑色的。 (如果第一个是白色的,情况是对称的,结果乘于2就OK了) 所以可以算第一个是黑色的。 你首先要枚举前x个是黑色的,第x+1个是白色的,枚举肯定 x <7了。 这样你对剩下部分进行DP转移,注意这个时候DP的时候,你要默认第一个一定涂白色。(这里的第一个其实是第x+1个)。 然后转移 n-x 个,看最后的状态合并起来不会冲突,不冲突就累加了。
1 | /* *************** |