题意:给定1~n的一个排列,能做的动作是逆转第1~第m个数,给出一种方案使数列变成1~n。
思路:简单模拟,之所以简单是因为不是求最少的操作数,而是给出一种方案即可。可是我还是贡献了wa,因为理解错了题意。题目中Flip是指逆转第1~第m的序列,而我理解成了交换第1和第m个数,ORZ。每次将最大的不在最终位置的数移动回去即可~
#include <cstdio>
#include <algorithm>
using namespace std;
#define N 35
int s[N],n,res[N<<1];
int main(){
while(scanf("%d",&n) && n){
int i,j,len = 0;
for(i = 1;i<=n;i++)
scanf("%d",&s[i]);
for(i = n;i>=1;i--){
if(s[i]!=i){
for(j = 1;j<=i;j++)
if(s[j] == i)
break;
if(j>1){
res[len++] = j;
reverse(&s[1], &s[j+1]);
}
res[len++] = i;
reverse(&s[1], &s[i+1]);
}
}
printf("%d ",len);
for(i = 0;i<len;i++)
printf("%d ",res[i]);
putchar('\n');
}
return 0;
}