松鼠排序(并查集)

松鼠排序

题目描述

松鼠宝宝有一排n个大小不一的坚果,松鼠宝宝想把坚果从小到大排序,每次他会选择两个坚果a和b每次花费1点力气把这两个坚果交换,爱动脑筋的松鼠宝宝想知道他排完这n个坚果一共需要花费的最少力气是多少?

输入描述:

第一行一个整数n代表坚果数

接下来一行n个整数代表每个坚果的大小(每个坚果大小都不一样,即大小为1-n的一个排列)

1<=n<=1e5

坚果大小x,1<=x<=n

输出描述:

一行输出代表松鼠宝宝花费的最小力气

示例1

输入

3
3 2 1

输出

1
#include
using namespace std;
int a[111000];
int main()
{
	int n,t=0,s=0,u,v;
	cin>>n;
	for(int i=1;i<=n;i++)
	cin>>a[i];
    for(int i=1;i<=n;i++)
    {
        if(a[i]!=i)
        {
            while(a[i]!=i)
            {
                swap(a[i],a[a[i]]);
                s++;
            }
        }
    }
	cout<

尼姆博弈(所有类型分析)

你可能感兴趣的:(算法,数据结构,c++)