一二三四五 上山打老虎

蓝桥杯-交换瓶子

题目链接:https://www.acwing.com/problem/content/1226/

思路:离散中的置换群概念,通过当前位置和最终要达到的位置构成环,计算环数k,需要交换的次数为n-k次

#include<bits/stdc++.h>

using namespace std;
int a[(int)1e4+5];
int b[(int)1e4+5];
int main (){
    int n,k=0;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++){
        if(!b[i]){
            k++;
            int atm=i;
            while(!b[atm]){
                b[atm]=1;
                atm=a[atm];
            }
        }
    }
    cout<<n-k;
    return 0;
}

或者写法(参考acwing):

#include<bits/stdc++.h>

using namespace std;
int a[(int)1e4+5];
int b[(int)1e4+5];
int main (){
    int n,k=0;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++){
        if(!b[i]){
            k++;
            for(int j=i;!b[j];j=a[j]){
                b[j]=1;
            }
        }
    }
    cout<<n-k;
    return 0;
}
posted @ 2021-04-14 16:06  黒川川  阅读(59)  评论(0)    收藏  举报