[USACO2.1]三值的排序 Sorting a Three-Valued Sequence

版权声明:转载无所谓的。。。 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则最大值为交换次数
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/83443098