pta--1054 The Dominant Color(20 分)(摩尔投票 或 map)

题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805422639136768

【分析】

题意:M*N长度的序列中找出出现次数大于规格一半的数字。

思路:摩尔投票算法或者map映射来做。

  • 摩尔投票:定义候选次数最多的值,以及计数变量cnt,在一次次的比较中,若两值相等cnt++,否则cnt--直到cnt减到0再对候选值重新赋值。最后的候选值就是要求的值。
  • map:map<int, int>,注意退出循环的条件

【代码】

摩尔投票:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int m,n;
	scanf("%d%d",&m,&n);
	int cnt=0,color=-1;//计数器和候选值
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			int tmp;
			scanf("%d",&tmp);
			if(color!=tmp)
			{
				if(cnt==0)
					color=tmp;//重新赋值
				else cnt--;
			}
			else cnt++;
		}
	}
	printf("%d\n",color);
	return 0;
}

map:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int m,n;
	scanf("%d%d",&m,&n);
	int half=m*n/2;
	map<int,int>cnt;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			int tmp;
			scanf("%d",&tmp);
			cnt[tmp]++;
			if(cnt[tmp]>half)
			{
				printf("%d\n",tmp);
				return 0;
			}
		}
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38735931/article/details/82386137