第一章:算法设计基础
1.1思维的体操
例1、例2是说了下贪心问题。(AC)
例3:分金币(代数分析) (AC)
问题描述:
一个圆桌旁围坐n个人,没人有一定数量的金币,问怎样给金币,可以使得每个人手中金币数量相等,且被转手的金币总数量最小。
解题思路:
设置了一些变量,最终将问题改变成了求解:给定数轴上n个点,找出一个到它们的距离之和尽量小的点。
这类问题的最优解即取这些数的“中位数”。
例4:墓地雕塑(寻找突破口,特殊性)
问题描述:
需要将m个新雕塑加入到n个原有雕塑中,仍使得n+m个雕塑均匀分布,求移动的总距离的最小值。
解题思路:
发现一个共同特点,原有的n个雕塑中肯定有一个不需要移动,那么在给定雕塑数量后,每个雕塑的位置就可以确定下来了!
收获:寻找突破口,发掘条件,由已知信息去引出一些必要的结论来帮助结题!
例5:蚂蚁(观察问题的特殊性,找其特殊点)
问题描述:
一根木棍上有n只蚂蚁,输出t秒后每只蚂蚁的状态位置。
要点:
(1)两蚂蚁“碰撞” == “对穿而过”;
(2)蚂蚁之间碰撞之后的相对位置是不变的!----这个特点是题目要求中按照原先顺序输出状态的关键!
例6:立方体成像:
1.2问题求解、常见策略:----这里主要强调了一种将实际问题建模的重要性!定义适当的数据结构,且将实际问题数字化!
例7:偶数矩阵(优化枚举)
问题描述:
给定01矩阵,改变尽量少的0为1,使得该矩阵每个元素的上下左右4个元素之和为偶数。输出改变元素的最小个数。
解题要点:
(1)全部枚举,枚举量过大;则采用枚举部分+计算其余部分的方式;
(2)此方法实现的前提:需要枚举量之间存在约束条件(题目要求,本题的是使得每个元素的上下左右4个元素之和为偶数),可以被我们使用,来计算其余量。
例8:彩色立方体(建模,为正方体每面编号,枚举列出每种反转情况+将问题数字化)
例9:中国麻将(建模,将问题数字化+枚举+递归判断是否“听牌”)
例10:正整数序列(寻找问题的特殊性质,细心+耐心)(AC)
问题描述:
给定整数n,使用最少的操作次数把序列1、2....n中所有的数字变成0,每次操作可以选择多个整数,同时减去一个相同大小的正整数。
解决:
f(n)=f(n/2)+1; 数据不强,直接递归求解即可。(下面是递归函数代码,数据量大的情况下改为递推即可。)
int f(int n){ return n==1 ? 1:f(n/2)+1; }
例11:新汉诺塔问题:
例12:组装电脑:
问题描述:
你有b元钱,需要组装一台电脑。给出n个配件的各自种类、品质和价格,要求每种类型的配件各买一个,总价格不超过b,且“品质最差配件”的品质因子应尽量大。
解决:
要求品质因子,题目中描述说明品质因子最大为 1e9,这里采用2分的方法寻找结果。
总的来说本题是采用的: 预处理+二分枚举+贪心。
例13:派
例14:填充正方形(AC)
问题描述:
向矩阵中填充大写字母。
解决:
贪心实例。(因为26个字母在本题中肯定使用不完,顾不存在回溯的情况,一遍贪心即可。)
<