当前位置: 代码迷 >> 综合 >> pta--1054 The Dominant Color(20 分)(摩尔投票 或 map)
  详细解决方案

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

热度:65   发布时间:2023-12-26 10:05:30.0

题目: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;
}

 

  相关解决方案