输入格式
输出格式
题意
给你一迭薄煎饼,请你写一个程式来指出要如何安排才能使这些薄煎饼由上到下依薄煎饼的半径由小到大排好。所有的薄煎饼半径均不相同。
要把薄煎饼排好序需要对这些薄煎饼做翻面(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。
输入输出样例
输入 #1 复制
1 2 3 4 5
5 4 3 2 1
5 1 2 3 4
输出 #1 复制
1 2 3 4 5
0
5 4 3 2 1
1 0
5 1 2 3 4
1 2 0
思路:选择排序思想。
#include<cstdio>
#include<iostream>
#include<sstream>
#include<algorithm>
using namespace std;
const int maxn = 30 + 10;
int n, a[maxn];
// 翻转a[0..p]
void flip(int p) {
for(int i = 0; i < p-i; i++)
swap(a[i], a[p-i]);
printf("%d ", n-p);
}
int main() {
string s;
while(getline(cin, s)) {
cout << s << "\n";
stringstream ss(s);
n = 0;
while(ss >> a[n]) n++;
for(int i = n-1; i > 0; i--) {
int p = max_element(a, a+i+1) - a; // 元素a[0..i]中的最大元素
if(p == i) continue;
if(p > 0) flip(p);
flip(i);
}
printf("0\n");
}
return 0;
}