题意
给你一个1..n的递增排列,问你操作1,2时期变成给出的序列
思路
我们考虑逆着操作,我们将给定的序列变成递增的序列,这时候操作2变成将末尾的数字移动到前面,这时候操作就很明显了,对于前面两个数字我们每次交换两者,保证前面的数字比较大,然后将大的移动到最后面,特殊情况是 4 1 2 3 这种情况做个特判就好了
#include <iostream>
#include <queue>
#include <string>
#include <algorithm>
using namespace std;
deque <int> dq;
int main()
{
int n;
while(cin>>n&&n)
{
int k;
string ans="";
dq.clear();
for(int i=0;i<n;i++) cin>>k,dq.push_back(k);
while(1)
{
int fg=1;
for(int i=0;i<dq.size();i++)
if(dq[i]!=i+1)
{
fg=0;
break;
}
if(fg) break;
if(dq[0]<dq[1]||(dq[0]==n&&dq[1]==1))
{
int t=dq.back();
dq.pop_back();
dq.push_front(t);
ans+='2';
}
else
{
swap(dq[0],dq[1]);
ans+='1';
}
}
reverse(ans.begin(), ans.end());
cout<<ans<<endl;
}
return 0;
}