#P2275. Flipping Pancake

    ID: 1276 传统题 1000ms 256MiB 尝试: 5 已通过: 1 难度: 10 上传者: 标签>Greater New York 2004贪心算法煎饼排序问题翻转序列生成

Flipping Pancake

描述

我们从一个包含 nn 个不同大小煎饼的堆栈开始。问题要求将这个堆栈转换为按大小排序的堆栈,其中最小的煎饼在顶部,最大的煎饼在底部。为此,我们被允许将顶部 kk 个煎饼作为一个整体进行翻转(这样第 kk 个煎饼现在位于顶部,而原先顶部的煎饼现在位于第 kk 个位置)。

例如:

本问题要求编写一个程序,找到最多 2n32n-3 次翻转的序列,将给定的煎饼堆栈转换为有序堆栈。

输入格式

输入的每一行提供一个独立的数据集,由空格分隔的数字组成。每行的第一个数字表示数据集中的煎饼数量 NN。当 NN 为 0 时输入结束(该行没有其他数据)。数据集的其余部分是数字 1 到 NN 的某种排列,表示初始的煎饼堆栈。 这些数字表示煎饼的相对大小。NN 最多为 30。

输出格式

对于每个数据集,输出一行由空格分隔的数字序列。每行的第一个数字 KK 表示排序煎饼所需的翻转次数。该数字后面跟着 KK 个数字,每个数字表示在相应的排序步骤中要翻转的煎饼数量。某些数据集可能有多个正确的解。例如,对于下面的第一个问题,3 3 2 33\ 3\ 2\ 3 也是一个有效的解。

输入样例 1

3 1 3 2
5 4 3 2 5 1
0

输出样例 1

3 2 3 2
3 3 4 5

来源 Greater New York 2004