UVA 11925 - Generating Permutations

题意:

  给出一个1到n的排列,给出操作顺序,使升序排列能变为所给排列。

分析:

  正常冒泡排序的想法。如果前两个数,前面的大于后面的,则换(特例是n,1不能换)。否则,就用2的逆操作,把最后的数放前面。不过用了vector数组存放

代码:

  

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
int n;
vector<int> a,ans;
int main()
{
int i,j;
while(~scanf("%d",&n)&&n)
{
a.clear();
ans.clear();
for(int i=0;i<n;++i)
{
int k;
scanf("%d",&k);
a.push_back(k);
}
while(1)
{
if(a[0]==1)
{
bool ok=true;
for(i=0;i<n;++i)
if(a[i]!=i+1)
{
ok=false;
break;
}
if(ok)
break;
}
if(a[0]<a[1]||(a[1]==1&&a[0]==n))
{
ans.push_back(2);
a.insert(a.begin(),a[n-1]);
a.erase(a.end()-1);
}
else
{
ans.push_back(1);
swap(a[0],a[1]);
}
}
for(i=ans.size()-1;i>=0;--i)
printf("%d",ans[i]);
printf("\n");
}
return 0;
}
posted @ 2015-11-01 20:11  幻世沉溺  阅读(187)  评论(0编辑  收藏  举报