Codechef September Challenge 2015

*本文仅提供浅显的引导性的思路,并不会完全说出做法,更不会给出代码,有这方面需求的速速离去!

1.Count Steps in Matrix 这里

很水,直 1 - NN 扫过去就行了

2.Chain of Doughnuts 这里

比较水,有坑点,就是需要注意到链的任意位置都可以被切断,包含多个圈的链也可以被切断。

3.Lighthouses 这里

很水,简单分析容易知道放置灯塔的个数只可能为1或者2,首先找是否存在一个点使得覆盖所有点,就是找左上,右上,左下,右下这四个方向啦;然后看是否存在两个点,方法之一:首先找到横坐标最小(设为 Min_x )的点 A ,然后看是否还有横坐标为 Min_x 的点,如有则选为第二个点 B ,否则选任意一个横坐标次小的点 B ,接下来就是选定 A,B 照亮的象限去覆盖整个平面了,简单思考下就知道了!

4.Bank robbery 这里

贪心,很多细节!

5.Cracking the Code 这里

也是比较水的题啦,第一眼看上去就知道是个矩阵快速幂,但是矩阵里的元素涉及到 2 , 3 ,直接快速幂就。。。精度什么的啊就GG了,这个就是本题的关键点,其实只要得出对应的 22 的矩阵然后加以变形就OK了,可以得出一个超级简洁的式子,代码也就20行左右!
然后比较坑的是官方数据说好的只有 109 ,结果交了无数发才了解到数据是大于 109 的。

6.Nikitosh and xor 这里

感觉是出的最好的一个题啊!

题意:给定一个 N 个数序列,找出 l1,r1,l2,r2 使得下式的值最大

(a[l1]a[l1+1]a[r1])+(a[l2]a[l2+1]a[r2])

1l1r1<l2r2N

是指异或运算;

思路:首先考查异或运算的性质,比较容易得到一段区间 lr 的异或值其实就是 L[l]L[r] , L[i] 表示从1开始到 i 异或前缀,这个预处理就行了,所以我们只需枚举Mid,求出区间[1,mid]内最大的两两异或值和区间[mid+1,n]内最大的两两异或值,最后取个最大值即可;
那么如何求出区间[1,mid]的最大的两两异或值呢?也就是MAX

L[i]L[j],1i<jmid
,直接暴力的方法会T的,正解就是处理最大异或值强有力的工具—-字典树,直接从左往右边插入边查询最大值,就OK了!

*推荐相关题:
1.利用异或的性质:HDU 5416
2.利用字典树求最大异或值:2015 UESTC Training for Data Structures C题
*不会的直接去搜神牛们的博客吧!

你可能感兴趣的:(CodeChef)