蓝桥杯-交换瓶子
题目链接: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;
}

浙公网安备 33010602011771号