ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1067 Sort with Swap(0, i) (25 分)

2021-07-13 12:34:09  阅读:245  来源: 互联网

标签:Sort 25 cnt ni int 100005 Swap time circle


1067 Sort with Swap(0, i) (25 分)

举个例子,有以下数据

i01234
a[i]04321

根据线性代数知识,可以分成{0},{1,4},{2,3}三组。
记包含0的组合的个数为 n 0 n_0 n0​,每个不包含0的组合为 n i n_i ni​
在包含0的组合交换次数为 n 0 − 1 n_0-1 n0​−1次,不包含0的组合需要先将0换入,然后交换 ( n i + 1 ) − 1 (n_i+1)-1 (ni​+1)−1次,再将0换出,即 n i + 1 n_i+1 ni​+1次
交换总次数= ( ∑ i = 0 n n i + 1 ) − 2 (\sum_{i=0}^nn_i+1)-2 (∑i=0n​ni​+1)−2
代码思想:通过circle数组标记已访问过的组合,cnt记录circle数组元素个数。

#include<cstdio>
#include<cstring>
int a[100005];
int t[100005];   //记录元素i的位置
bool circle[100005];
int main()
{
	memset(circle,false,sizeof(circle));
	int n,cnt=0,p,time;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
		t[a[i]]=i;
	}
	for(int i=0;i<n;i++)
	{
		p=i;
		if(circle[p]||a[i]==i) continue;
		time=0;
		while(circle[p]==false)
		{
			circle[p]=true;
			p=t[p];
			time++; 
		}
		if(i==0) time-=1;
		else time+=1;
		cnt+=time;
	}
	printf("%d",cnt);
	return 0;
}

标签:Sort,25,cnt,ni,int,100005,Swap,time,circle
来源: https://blog.csdn.net/weixin_43792889/article/details/118696655

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有