Stacks of Flapjacks: python编程问题(看好了是python,不是C++)

来源:百度知道 编辑:UC知道 时间:2024/07/03 10:57:36
Q120: Stacks of Flapjacks
给你一叠薄煎饼,请你写一个程式来指出要如何安排才能使这些薄煎饼由上到下依薄煎饼的半径由小到大排好。所有的薄煎饼半径均不相同。

要把薄煎饼排好序需要对这些薄煎饼做翻面(flip)的动作。方法是以一抹刀插入一叠薄煎饼中,然后做翻面的动作(也就是说在抹刀上面的薄煎饼经翻面后,会依相反的次序排列)。若一叠共有n个薄煎饼,我们定义最底下的薄煎饼的位置为1,最上面的薄煎饼位置为n。当抹刀插入位置为k时,代表从位置k到位置n的薄煎饼要做翻面的动作。

一开始时,这叠薄煎饼随意堆放,并以半径大小来表示。例如:以下3叠薄煎饼(最左边那一叠8是最上面一个薄煎饼的半径)

8 7 2
4 6 5
6 4 8
7 8 4
5 5 6
2 2 7
对最左边那叠薄煎饼,如果我们把抹刀插在位置3(就是半径为7的那块薄煎饼的下面)的地方做翻面,就会得到中间那叠,如果我们再把抹刀插在位置1(就是半径为2的那块薄煎饼的下面)的地方做翻面,就会得到最右边那叠。

Input

每组测试资料一列,内容为这一叠薄煎饼一开始的状态。每列开始的整数(介於1到100之间)代表位於最上方薄煎饼的半径,依此类推。薄煎饼的数目介於1到30之间。请参考Sample Input。

Output

对每一组测试资料输出2列。第一列为原来那叠薄煎饼。第2列则为要使这叠薄煎饼由小到大排列所做的翻面的动作。数字代表抹刀所插入的位置。(0代表已完成)。如果已经排好了,则不需再有翻面的动作。请参考Sample Output。

Sample Input

1 2 3 4 5
5 4

ACM ?

思路如下:
比如有5个:15243
1、判断最大的数(5)在第几个(2)。 (很遗憾list没有find或者getitem方法,得写一个小函数,2、3行)
2、从刀插进去,将该数放到顶 13425 (get slice方法)
3、刀从第一个插,该数到底 52431 (用 list.reverse())
4、判断第二大的数(4)在第几个,重复2~3,最后得到54321…… (一开始是一个循环,for i in range(len(list),0,-1))

现在系统没有python……明天看看能不能把程序写出来……

===============================11月23日更新 18:47==================

吼吼!下了个pythonportable~ 可以随时py了
修正一下,list有index这个方法……
程序如下:

def analyze(Mylist):
  sequence=[] #初始化排序方法
  for i in range(len(Mylist),0,-1): #逆序将饼排到底
    if Mylist[len(Mylist)-i] == i :
      pass #如果第i各就是i的话就不排序跳到下一个数
    else :
      sequence.append(Mylist.index(i)+1) #记录下翻转方法,python从0开始而本题中从1开始
      print "sequence = ",sequence