算法竞赛进阶指南 0x00

0101a^b

快速幂模板,写一下快速幂的原理。

我们知道,一个数\(n\)在二进制(也可以是其他进制)下可以被表示为\(a_1+a_2*2^1+a_3*2^2+...+a_m*2^{m-1}\)。那么我们可以考虑将其分拆成二进制状态下的每一位,然后做幂运算。这样做的时间复杂度为\(O(log_2 n)\)

实现的过程类似于倒过来的分治(当然也可以直接分治实现),原理基于以下的式子。

对于k为偶数,\(n^k=(n^2)^{k/2}\)

对于k为奇数,\(n^k=n*(n^2)^{(k-1)/2}\)

0102 64位整数乘法

本质上和上一道题一样,注意数据范围即可。

0103 最短Hamilton路径

状压DP。

\(f[i][j]\)表示在经过的点状态为i,当前位置在j上路径长度的最小值。

枚举中转点进行转移即可。

0301 递归实现指数型枚举

dfs,在每个状态都输出一下。

0302 递归/非递归实现组合型枚举

dfs,限制结束长度。

0303 递归实现排列型枚举

dfs。

0304 IncDec Sequence

运用差分数列性质的妙题。

众所周知,差分就是前缀和的逆运算,当相邻两个元素相同的时候,差分数列里对应的一项会变为0,

当我们将某一个区间加上或减去1的时候,差分数列里只有两项变化,所以这就是个结论题了。

统计差分序列里正数之和与负数之和的绝对值(不包括第一项),取最大值就是第一个答案,差的绝对值+1就是第二个答案。

0501 货仓选址

小学奥数结论题,中间最小。下面给出证明:

假设仓库的坐标为\(a_1,a_2,...,a_n\),选择的位置为\(x\),那么本题等价于求

\(|x-a_1|+|x-a_2|+...+|x-a_n|\)

的最小值。

假设n为奇数,那么我们可以将除了\(a_{(n+1)/2}\)的项两两配对,对于每一个配对\((a_k,a_{n+1-k})\)\(|x-a_k|+|x-a_{n+1-k}|\)的最小值在\(k\leq x\leq (n+1-k)\)的时候取到。

显然当\((n-1)/2\leq x\leq (n+3)/2\)的时候对于除了\(a_{(n+1)/2}\)的项之和取到了最小值,那么只要取\(x=a_{(n+1)/2}\)就可以取到整个算式的最小值了。

当n为偶数时同理之。

POJ3614 Sunscreen

首先明确一个问题:选A和放弃A选B本质上不存在优劣之分(不考虑对其他牛的影响),因此尽量满足当前牛肯定不会有错。

我们将牛的下限从大到小排序,然后将防晒霜也从大到小排序,对于每一头牛,我们遍历防晒霜寻找小于它上限且最大的防晒霜。

正确性证明:

假如对于现在这头牛有更好的选法,那显然只能选更小的,那么就浪费了现在的这个选择。浪费=没那么好,Q.E.D

POJ1328 Radar Installation

这道题第一眼有点复杂,但其实可以进行简化。

对于每一个点都可以在x轴上找到一条对应的线段,使任何建立在线段上的雷达都能都包含该点。

那么本题即可转换为求对于一系列线段,使所有线段都包含点的最少数量。

将线段对于左端点排序,然后记录最右侧的点。

如果现在的线段的左端点大于最右侧的点,那么只能新加一个点。

反之,尽可能将最右侧的点向右移(在不违背已有线段的前提下)。

正确性过于显然。

转载于:https://www.cnblogs.com/ilverene/p/11142206.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值