煎饼堆问题

       有一堆煎饼,直径各异,摞成一堆。可用一把铲子插入任意两张饼之间,完成一次对铲子之上所有饼的翻转操作。假设最底部的饼的位置为1,最顶层的饼的位置为n。对第i (1≤i≤n) 张饼及其上的所有饼的一次翻转操作可以记为flip(i)。

例如:

      8        7        2
      4        6        5
      6        4        8
      7  ->    8  ->    4
      5        5        6
      2        2        7

最左边一列经过flip(3)变为中间一列,而中间一列经过flip(1)变为最右边一列。

求算法,使得能对任意给出的一堆饼经过如上操作变为有序堆。堆中最小直径的饼在最顶层,最大直径的饼在最底层。

算法很简单,在n个饼组成的堆中找到直径最大的饼,假设其位置为m,作一次flip(m)操作。操作后,最大的饼就位于堆顶,然后再作一次flip(1),使最大的饼处于最底层。由于底层的饼为最大,它肯定不会再参与后面的flip操作。接下来只需对剩余的n-1张饼作同样的操作即可,找到递归结构。

PancakeSort(A, n)
   if n== 0 then return
   p <- FoundMax(A, n)
   Flip(p)
   Flip(1)   // 每一次Flip(1)都是针对当前A来说的。
   A <- A+1
   n <- n-1
   PancakeSort(A, n)

其中A为一个数组用以保存饼堆,n表当前饼堆的大小。

问题不复杂,但有点趣味。


原题可以在此处找到:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&page=show_problem&problem=56

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值