目录
题目大意
题目描述
松鼠宝宝有一排n个大小不一的坚果,松鼠宝宝想把坚果从小到大排序,每次他会选择两个坚果a和b每次花费1点力气把这两个坚果交换,爱动脑筋的松鼠宝宝想知道他排完这n个坚果一共需要花费的最少力气是多少?
输入描述
第一行一个整数n代表坚果数
接下来一行n个整数代表每个坚果的大小(每个坚果大小都不一样,即大小为1-n的一个排列)
1<=n<=1e5
坚果大小x,1<=x<=n
输出描述
一行输出代表松鼠宝宝花费的最小力气
输入
3 3 2 1
输出
1
解题思路
将给定的一串数与对应的下标进行匹配,若该数与下表不匹配时,将该数与相匹配的下标所对应的数进行交换,知道所有数都与下标所匹配为止。
实现代码及注释
#include<iostream>
using namespace std;
int a[100005];
int b[100005];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[a[i]]=i;//与a[i]所对应的下标
}
int ans=0;
for(int i=1;i<=n;i++)
{
if(a[i]!=i)//若该数与下标不匹配时
{
ans++; //交换次数
a[b[i]]=a[i]; //两数交换
b[a[i]]=b[i];
}
}
cout<<ans<<endl;
}