煎饼 | |
|
问题描述
有一叠煎饼正在锅里。煎饼共有n(n<=30)张,每张饼都有一个数字,代表它的大小,每个饼的大小都不同。厨师每次可以选一个数字k,把从锅底开始数第k张上面的煎饼(包括第k张)全部翻过来,即原来在上面的煎饼现在到了下面。
例如,一开始一叠煎饼如下:
5
1
2
3
4
第一次,厨师选了数字1,把第1张饼开始往上面的饼都翻了过来,得到下面一叠饼
4
3
2
1
5
第二次,厨师选了数字2,把第2张饼开始往上的所有饼都翻转了过来,得到下面一叠饼
1
2
3
4
5
给出最开始一叠饼的形态,请你设计一种翻转方法使得所有饼从上往下按从小到大的顺序排列。
输入格式
第一行,一个数字n表示饼的个数
第二行,n个空格间隔的整数,表示从上往下每个饼的大小
输出格式
第一行,一个整数,表示最少翻动的次数
第二行,若干个数字,每个数字表示一次翻动的位置。若一次都不需要翻转,直接输出0
样例输入
5
5 1 2 3 4
样例输出
2
1 2
提示
1<=饼上的数字<=100
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,a[105],b[105],ans[105],cnt=0;
cin>>n;
int i,j,k;
for(i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
}
sort(b+1,b+n+1);
for(i=n;i>=1;i--){
if(a[i]!=b[i]&&a[1]==b[i]){
cnt++;
ans[cnt]=n-i+1;
for(j=1;j<=i/2;j++) swap(a[j],a[i-j+1]);
}
else if(a[i]!=b[i]&&a[1]!=b[i]){
for(j=2;j<=n;j++) if(a[j]==b[i]) break;
cnt++;
ans[cnt]=n-j+1;
for(k=1;k<=j/2;k++) swap(a[k],a[j-k+1]);
cnt++;
ans[cnt]=n-i+1;
for(k=1;k<=i/2;k++) swap(a[k],a[i-k+1]);
}
}
if(cnt==0){
cout<<"0";
return 0;
}
cout<<cnt<<endl;
for(int i=1;i<=cnt;i++)
cout<<ans[i]<<" ";
return 0;
}