算法第四章实践
第一题,直接一个排序,从小到大一直减下去,直到不能减,就能得出答案。
第二题,删数。策略是使处于高位的数尽可能小,就可以使最后的数,从高到低每一位都是最小的。方法,从头扫到尾,从高位到低位。如果当前的数大于下一位,那么删去当前的数,使一个更小的数来取代这个位,就可以得到一个最优的数。
第三题,跟课堂上说的思路差不多。而通俗简单易懂的说法就是:每一次都需要m+n-1次比较,那么求最少比较次数时,每一次找最小的m和n,直到所有序列都合并在一起。同理,求最多比较次数时,每一次找最大的m和n,就可以使每一次的m+n-1的值尽可能的大。
第一题较容易,所以一开始就直接做出来了。第二题在第一次看的时候卡住了,就先跳到第三题。而第三题因为上一节课讲过,有印象,就很快有思路了。不过嘛,emm,为了方便理解(当时懒得优化),代码写的就有点难看,可以优化的地方还有很多很多。第二题放在了最后,在讨论了多个样例和方法后,比如从头到尾删去最大的k个数;找出最小的数当最高位然后再分类讨论,不过这个很复杂,就直接被灭了。最后想出,如果要求最小的,那么就是使它高位的数字尽可能的小,比如某一次删一个数的时候,每种可能列出来,为什么这个是最小的而其他并不是。最后总结得出结论:如果当前的数是递增的,那么后面的数上来时会比当前的数大,就会导致形成的数比最优的数大。做完后还有40分钟才下课,就开始没事干,去教其他同学,划水摸鱼玩手机,也是挺快乐的~