版权声明:转载无所谓的。。。 https://blog.csdn.net/xuxiayang/article/details/83443098
大意
给定一组只有1,2,3的数,求变成升序的最小交换次数
思路
先把所有的数出现的次数计算出来,然后,若是在本该放1的地方出现了2或3,那么2和3就要对应多换一次,同理,若是在本该放2的地方出现了1,或3,那么1,和3就要对应多换一次,反而,若是在本该放三的地方出现了1,2,可以直接忽略,因为在之前就已经交换过了
代码
#include<cstdio>
using namespace std;int a[4],count[4],num[1001],n;
signed main()
{
scanf("%d",&n);
for(register int i=1;i<=n;i++) scanf("%d",num+i),count[num[i]]++;
for(register int i=1;i<=count[1];i++)
{
if(num[i]==1) continue;
a[num[i]]++;
}
for(register int i=count[1]+1;i<=count[1]+count[2];i++)
{
if(num[i]==2) continue;
a[num[i]]++;
}
printf("%d",a[3]+(a[1]>a[2]?a[1]:a[2]));//因为前面出现了3是必须要换的,直接加上,反而前面出现了1或2则最大值为交换次数
}