*本文仅提供浅显的引导性的思路,并不会完全说出做法,更不会给出代码,有这方面需求的速速离去!
1.Count Steps in Matrix 这里
很水,直 1 -
N∗N 扫过去就行了
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了,这个就是本题的关键点,其实只要得出对应的 2∗2 的矩阵然后加以变形就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])
1≤l1≤r1<l2≤r2≤N
⊕ 是指异或运算;思路:首先考查异或运算的性质,比较容易得到一段区间 l…r 的异或值其实就是 L[l]⊕L[r] , L[i] 表示从1开始到 i 异或前缀,这个预处理就行了,所以我们只需枚举Mid,求出区间[1,mid]内最大的两两异或值和区间[mid+1,n]内最大的两两异或值,最后取个最大值即可;
那么如何求出区间[1,mid]的最大的两两异或值呢?也就是MAX,直接暴力的方法会T的,正解就是处理最大异或值强有力的工具—-字典树,直接从左往右边插入边查询最大值,就OK了!L[i]⊕L[j],1≤i<j≤mid *推荐相关题:
1.利用异或的性质:HDU 5416
2.利用字典树求最大异或值:2015 UESTC Training for Data Structures C题
*不会的直接去搜神牛们的博客吧!