您的位置:首页 > 其它

PAT (Advanced Level) 1067. Sort with Swap(0,*) (25)

2016-07-01 11:01 423 查看
只对没有归位的数进行交换。

分两种情况:

如果0在最前面,那么随便拿一个没有归位的数和0交换位置。

如果0不在最前面,那么必然可以归位一个数字,将那个数字归位。

这样模拟一下即可。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
#include<stack>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;

int n;
int a[100000+10];
queue<int>Q;
int pos[100000+10];

int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
for(int i=0;i<n;i++) pos[a[i]]=i;
for(int i=0;i<n;i++)
{
if(a[i]==0) continue;
if(a[i]!=i) Q.push(a[i]);
}

int ans=0;
while(1)
{
if(a[0]==0)
{
while(!Q.empty())
{
int head=Q.front(); Q.pop();
if(a[head]==head) continue;
else
{
ans++;
int pos1=pos[0];
int pos2=pos[head];
swap(a[pos1],a[pos2]);
swap(pos[head],pos[0]);
break;
}
}
if(Q.empty()) break;
}
else
{
ans++;
int pos1=pos[0];
int pos2=pos[pos[0]];
int num1=0;
int num2=pos[0];
swap(a[pos1],a[pos2]);
swap(pos[num1],pos[num2]);
}
}
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: