Generating Permutations UVA - 11925

题意

给你一个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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值