1067 Sort with Swap(0, i) (25 分)难度: 中 / 知识点: 置换群

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1067 Sort with Swap(0, i) (25 分)难度: 中 / 知识点: 置换群相关的知识,希望对你有一定的参考价值。


https://pintia.cn/problem-sets/994805342720868352/problems/994805403651522560
这种相关的题目见过很多次了。
常见的是只可以交换相邻两项求,有序后最少的步数。这类模型直接求逆序对即可。
还有一种模型是可以任意的交换两个数,求有序后最小的步数,答案是 n-环的个数。
本题和上面的差不多的思路,不过是加了必须通过0来交换的这一条限制。
首先,可以分析的得出,这个数组对应图的话都是一个个的环,向这种只有环的图称为置换图

  • 如果这个数本身是一个自环,那么说明他已经在对应的位置了,那么直接跳过。
  • 如果一个环和0在同一个环内,共有cnt个点,那么我们需要交换 cnt-1 此。
  • 如果一个环没有0,且共有cnt个点,那么首先我们得先将0加进来,然后再依次交换。加入进来1次操作,cnt+1个点交换 需要cnt次 故共cnt+1次
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],st[N],n,ans;
int main(void)
{
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i];
	for(int i=0;i<n;i++)
	{
		if(a[i]==i) continue;//自环
		if(!st[i]) 
		{
			bool flag=false;
			int cnt=0;//点的个数
			for(int j=i;!st[j];j=a[j])
			{
				if(j==0) flag=true;
				cnt++;
				st[j]=1;
			}
			if(flag) ans+=cnt-1;//和零在同一个环
			else ans+=cnt+1;//和零不在同一个环
		}
	}
	cout<<ans<<endl;
	return 0;
}

以上是关于1067 Sort with Swap(0, i) (25 分)难度: 中 / 知识点: 置换群的主要内容,如果未能解决你的问题,请参考以下文章

PAT甲级——A1067 Sort with Swap(0, i)

PAT 甲级 1067 Sort with Swap(0, i) (25 分)(贪心,思维题)*

1067 Sort with Swap(0, i) (25 分)难度: 中 / 知识点: 置换群

PAT Advanced 1067 Sort with Swap(0,*) (25) [贪?算法]

1067. Sort with Swap(0,*) (25)贪心——PAT (Advanced Level) Practise

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