松鼠排序

发布时间 2023-07-13 17:05:49作者: BoBolilla

松鼠排序

题目

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

思路

index 1 2 3 4 5 6 7

value 7 3 5 2 4 1 6 将位子和其对应的数字想象成一个图

1 -> 7 -> 6 -> 1

2 -> 3 -> 5 -> 4 -> 2 其必然形成一个环状(相当于n个点n条边

有可能是好几个环,将如上例就是两个环 ,答案就是每个环边数-1后再相加

代码

int vis[N],a[N];
void solve()
{
    int n,res=0;
    cin >> n;
   for(int i=1;i<=n;i++) cin >> a[i];
  
    for(int i=1;i<n;i++)
    {
        if(vis[i]) continue;
        int cnt = 0;
        int x = i;
        while(!vis[x])
        {
            vis[x] = 1;
            x = a[x];
            cnt++;
        }
        res += cnt-1;
    }
    cout << res;
}