This is my blog.
(未完待续)
算法里面最基础的莫过于枚举、贪心、二分、搜索、分治、排序、模拟。
在这里,我简单记述一下其核心思想和自己的一些理解,并附上相关练习题(若此题做过,会附上AC代码,此博客会不断更新)
枚举
枚举:顾名思义就是把每个可能去试一遍,但是怎么枚举能使每一个可能都包含到?怎么枚举能不重复?怎么枚举可以满足题目规定的时间?所以这里我会附上优化和剪枝的内容。
上例子
思路一:枚举所有的正方形,看四个顶点是否都是“#”
思路二:枚举所有“#”,是否可以构成正方形
上述两个思路是否有优劣之分?
那我们再来想想,如何确定一个正方形,是否需要四个点呢?
很显然,确定一个正方形只需要对角线上两个点即可,也就是说我们可以通过两个点,算出另外两个点的位置。
那么我们可以通过枚举两个点,用一个判断函数,找另外两个点是否符合要求。
怎么是符合要求呢?首先算出的两个点必须是整数,再者两个位置必须是“#”。
怎么计算那两个点呢?我们来看一下示意图:
注意,因为有除法,有精度的问题,在实际应用中应除以2.0,而在后面确定整数时,因为有精度误差,所以不能直接和整数比,而应该相减后的差值在误差范围内。
这样的时间复杂度为O(n^2),还可以优化吗?
答案是肯定的,目前想到的优化有:
1.枚举时,第一个点从左上开始,那么第二个点枚举的时候从右下开始。因为题目中所需要找的是最大的正方形。
2.设置一个全局变量ans,如果比ans大的时候,更新,否则跳出循环(因为再接下去找的点肯定比目前的tmp还小,所以不用考虑了,即剪枝。)
附上核心代码:
补充尺取法:
我们用例子来说明:
所谓尺取法,也称双指针法,但在实际应用中,我们不用指针,而是使用两个变量,来代替指针。
比如此题,因为题目要求连续一段,于是我们可以用尺取法来做。
我们设置变量l,r。l表示开始点,r代表结束点,r-l代表选取的长度。
我们可以设置一个cnt数组来记录在l-r范围内每张牌子的个数,t数组表示牌子的价钱,如果左边的牌子在这段范围内有的话,可以将做指针往右移动,直至左指针的牌子在整段内只有一个,当所有的种类tot==m时,就说明这是一种可行的取法,更新ans值即可。
附上代码
再给上一题,这个枚举则是关于几何方面的:
解法一:枚举上下左右四个边界,判断中间有没有点
解法二:枚举左右边界,对处在边界内的点排序,每两个相邻的点和左右边界组成一个矩形。
解法三:悬线法。若是障碍点,不可延伸。若不是障碍点,则长度+1,直至到障碍点或到边界点。
其实相当于枚举边长。然后从左边悬线开始往右扫,若右悬线小于,则break,换下一根悬线。
(这题目前只有思路,还没有实现代码)
贪心
贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,他所做出的是在某种意义上的局部最优解。
上题吧
假设在队伍中有A,B两人,他们的先后顺序对其他人是没有影响。
设他们之前最多的奖赏为π,
若A在前面,则max(π/rA,πlA/rB)
若A在后面,则max(π/rB,πlB/rA)
假设A前,ans值更小,那么有max(π/rA,πlA/rB)<max(π/rB,πlB/rA)
易知: π/rA<πlB/rA; πlA/rB>π/rB;
所以只需πlA/rB < πlB/rA
即:rAlA<rBlB
则将每一个人的l与r相乘,将其排序即可
这道题可能有人会觉得不怎么像,其实在分析问题的时候我们就用到了贪心的思想。
再来一题,来感受一下贪心吧!
一些位运算
|
|
其中xor为异或的意思,在大数计算时,我们常常会用到位运算。
1.根据题意我们就可以知道,我们需要用位运算;
2.求最大值,根据贪心的思想,我们应从高位开始
3.我们来分析一下在第i位可能的情况:
(1)两者均可取0 1,则定可以取到……1000……和……0111……
,他们异或后结果为……1111……
(2)两者唯一,那只能这么取
(3)若 x只能取1,而y可取1或0,那么y必取0,之后的上界变为……01111……
若 x只能取0,而y可取1或0,那么y必取1,之后的下界变为……11111……
注意:1.<<左移 >>右移,他们的优先级较低,一般需要用括号
2.(long long)1
可写成1LL
,且需观察一下评判机的系统,若为windows,则应为%I64d;若为linux,则应为%lld。
3.1e18约等于2^63
4.double输入为%lf,而输出是%f,不是%lf了
5.很多大佬会在scanf(“ %s”)中打上括号
其他:在codeblocks中ctrl+D复制一行(本人将会弃用codeblocks,其快捷键不会将特殊说明,但这个快捷键真的很好用)
二分
三分
这次做了2017下半年搜狗的题目,用到了三分,但是只过了40%,后来发现可能是输入的问题,但不知道再去何处提交。(感谢博博的help,队长厉害呢)
上题:
我的错误代码
|
|
愿 我是你的小太阳