《算法竞赛入门经典》算法设计与优化策略(总结)

来源:互联网 发布:虚拟机ubuntu nat上网 编辑:程序博客网 时间:2024/05/29 07:50

例题8-1
很好奇 = =后台程序的判定方法,这里只要最终给出按规则的反转最后得到有序序列就可以了,刚开始我是直接先判断最后一个数与排好序的数最后一个数是否相等,是就往前移一位,知道有不同的出现,然后将不同的翻到第一个位置,然后再从前往后找它该插的位置,最后i还要++因为是用for()循环从后往前的,原来数走后新的数还没有判断。这样原本排好序的数字,后面任然有被翻动的可能,要一直翻到现在的i与排好序的该位置数字相同,因此特别耗时
答案的方法比较巧妙,思路可以说是很我反过来,先用max_element()找到最大值然后翻到第一个,在从第一个翻到最后一个,下次排除最后那个点,这样只需翻转n-1次就一定可以完全排好序。

例题8-2
这题还是很好奇后台程序怎么判断的
先预处理下用个数组存国家,注意Z和a之间ASCII码不相连
有点巧妙的是让n个格子相邻的一个方法就是两层一层安横排列一层竖排列,这样每两种颜色都正好有一个点相邻

例题8-3(有点中间相遇的思想)
想都不用想= =四个for循环,
然后一般都是将一部分移动到对面,这样分开求解时间复杂度小,然后一般枚举完排个序,后面用二分查找,n^2logn的时间复杂度,upper_bound()-lower_bound()求的是一段数组相同的元素。hash表和map还没学到= =以后再说。

例题8-4
因为行和列不影响就分开判断两次,这样问题就变成了每段区间取一个点(区间有重叠),点的位置不能相同。以每段区间的结束排序,然后优先匹配前面的区间,
贪心算法分析:如果优先匹配后面的区间,将前面的区间的放到后面区间原来选的点,等价于原情况,但是前面的区间可能取不到后面区间那个位置,因此原来的为最优解。

而且该题程序不好实现,直接排序的

例题8-5
每次将右边的所有人看成一个整体,他们拿了或者送了左边这个的酒。.
例题8-6
绝对难题= =
首先你需要知道算两边的黑白不如将一边的黑直接翻过去,这样一边的点就是要求的全部点,然后每次一一个点为原点计算向量的值,再每次一一个向量的边为分割点,然后按极角大小一次统计cnt数量,这些向量相当于扫描点,通过R=(R+1)%k太巧妙了。通过叉积来判断两个向量之间的夹角有没有超过180度因为atan2伤精度。

1 0
原创粉丝点击