题目描述:给你一个特定序列,要求你经过一定的变换规则将升序列变为给的特定序列。变换规则为:1.第一个元素和第二个元素交换. 2、首元素到尾部。
题目分析:借鉴的别人的。将一个升序列变为特定序列显然不如把这个特定序列变为一个升序列容易。那么就逆着处理,最后输出的时候倒着输出就行了。方法类似于冒泡排序的思想,若第一个元素大于第二个元素则交换,否则将最后一个元素变为首元素。注意:到第一个元素是n时,不进行交换,否则会出现死循环。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int t,n,m,ans[maxn];
deque<int>p;
bool check(){
for(int i=0;i<p.size()-1;i++){
// printf("%d ",p[i]);
if(p[i]>p[i+1])return 0;
}
return 1;
}
int main(){
while(scanf("%d",&n)&&n){
int k=0;
p.clear();
for(int i=1,x;i<=n;i++){
scanf("%d",&x);
p.push_back(x);
}
while(!check()){
if(p[0]>p[1]&&p[0]!=n){
swap(p[0],p[1]);
ans[++k]=1;
}
else{
int x=p.back();p.pop_back();
p.push_front(x);
ans[++k]=2;
}
//printf("\n");
}
for(int i=k;i;i--){
printf("%d",ans[i]);
}
printf("\n");
}
}