ACM第三周学习总结
贪心算法的最难之处并不是代码,而是思路,这不仅是我们这堂课的核心,还是所有关于算法问题解决复杂问题的关键!
这周的训练进程长时间地被困在代码的运行结果上,很快便忽视了思路的完整性。经过上次夜里的比赛,我想明白了一个问题:对于起步较晚又不是很聪明的我们来说,做题的多少并不能成为衡量我们算法能力的最佳标准,出于担心学分而盲目赶题的行为并不利于我们整体思路构建能力的提升。很多时候代码写到一半就不知道接下来该怎么处理了,很大程度上就是这个原因。因此我决定回归问题本身,并探寻问题与思路之间的巧妙联系。
简单问题
- 数据区间合并
- 最低工资支付
复杂问题
- 模拟问题1
拉回吃花的奶牛
这道题要求我们在考虑问题时参考的数据有两个,其中一个是拉回奶牛所需要的时间,另一个是奶牛吃花的速度。这就等于告诉我们无论先拉回哪头奶牛,我们做需要的总时间是不变的,所以我们需要考虑到的是如何使奶牛吃掉的总花数最少。从这里,我们很容易拥有第一种贪心策略——按吃花速度降序排序。但很快我们便会发现这个思路与题目要求存在很大区别,不过我们也可以按距离也就是拉回每头奶牛所需的总时间进行排序,这时第二种贪心策略,事实上它也并不能彻底解决问题。这时我们往往会产生一种错觉,是不是排序的准数有先有后?还是说问题根本就需要枚举出所有情况?这时,我们所需要的就是模拟基本问题。即用最简单的两头牛的最优思路来了解问题。过去我也有此疑问:为什么要这样做?
回归问题本身,我们不难发现:这道题最难的地方只有一个,那就是多头奶牛。如果我们直接处理两头奶牛,也会更容易地发现问题的本质。 - 模拟问题2
写作业免扣分
这道题要求我们在考虑问题时需要参考的数据同样有两个,其一就是作业提交的截止日期,其二则是作业的分值。说来很奇怪,在1中并不适合的思路在这道题中却能大放异彩。排序准数的有先有后在这里寻到了属于它自己的舞台。可这究竟是问什么?其实,究其根本,答案就在问题本身。1的问题在解决时可以不分先后,而这里的第一个参考数据就是截止日期,这就使得这两个问题之间出现了一道明显的分水岭。但是在解决后续思路时,这道题依旧需要利用模拟思路来解决。 - 假模拟问题
查理到校的时间
这道题从一开始就很容易将人误导,因为每位同学的到校方式也同样有两个数据需要考虑,一个是出发的时间,一个是骑行的速度。很快,我们便陷入了模拟的痛苦循环之中,因为从一点一滴来组成查理到校的全程是可以分很多种情况的,这就说明这道题的算法思路并不是模拟。纵观全局,查理已经为自己上学选好了最为贪心的策略。我们需要考虑的只有结果。从中我们不难发现,查理到校的时间和最快学生到校的时间相等,这样一来,该问题从复杂问题变成了简单问题。
我的想法
代码问题是这门课所不应该谈及的基础,这句话我应该时刻牢记于心。思路的解决问题还需要我区继续探索属于自己的思路。