1054. The Dominant Color (20)

本文介绍了一种高效的算法来解决PAT-A-1054问题,该问题要求从M*N矩阵中找出占比超过一半的数字。通过在线处理法,设置变量cur和计数器cnt,遍历数组并更新这两个变量,最终确定主元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 原题: https://www.patest.cn/contests/pat-a-practise/1054

2. 思路:

题意:
在M*N个数中,找出占比超过一半的数字。
思路:
有多种方法,最普通的是用数组下标映射数字,记录最大值输出。
还有一种巧妙的方法,即在线处理法。


题目说存在一个主元素,即一个数超过一半。
相当于这个数的个数减去其他不同的个数仍然大于0.
所以,我们可以设置一个变量cur,即当前的主元素,及它的个数cnt。
在读入数据的时候,如果相等,cnt++, 不等就自减。一旦cnt小于0的时候,
那这个数cur肯定不是主元素,更换cur为当前统计的数。
统计完直接输出cur。
不要用cin,超时。
已AC。

3. 源码(已AC):

#include<iostream>
using namespace std;

int main(void)
{
	//freopen("in.txt", "r", stdin);
	int M, N;
	scanf("%d %d", &M, &N);
	int num = M*N;//总个数
	int cur, cnt = 1;//分别为当前颜色,个数
	scanf("%d", &cur);//先读入第一个,初始化。

	for (int i = 1; i < num; i++)
	{
		int tem;
		scanf("%d", &tem);
		if (cur == tem)//相等,自增
			cnt++;
		else
		{
			cnt--;
			if (cnt < 0)
			{
				cur = tem;//小于0,更换主元素,cnt设为1
				cnt = 1;
			}
		}
	}
	printf("%d\n", cur);

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值