PAT甲级 1054 The Dominant Color (20 分)

题目

Behind the scenes in the computer’s memory, color is always talked about as a series of 24 bits of information for each pixel. In an image, the color with the largest proportional area is called the dominant color. A strictly dominant color takes more than half of the total area. Now given an image of resolution M by N (for example, 800×600), you are supposed to point out the strictly dominant color.

Input Specification:

Each input file contains one test case. For each case, the first line contains 2 positive numbers: M (≤800) and N (≤600) which are the resolutions of the image. Then N lines follow, each contains M digital colors in the range [0,2^24). It is guaranteed that the strictly dominant color exists for each input image. All the numbers in a line are separated by a space.

Output Specification:

For each test case, simply print the dominant color in a line.

Sample Input:

5 3
0 0 255 16777215 24
24 24 0 0 24
24 0 24 24 24
结尾无空行

Sample Output:

24
结尾无空行

题解

题目大意

虽说是讲在所给图像中找出主色,并给出了主色定义,但本质上是在所给数据中找出出现次数最多的数字,同时题目保证主色一定存在,因此出现次数最多的数字一定是数量过半符合题意的,所以不必对是否过半进行判断。

非正规思路

看完题目也许会觉得是一道简单模拟,会想到之前的做法,开一个数组,下标存储数值,数组值为该数出现的次数,但问题在于题目中的要求:每个像素点的数据范围为[0,2^24),所以如果只是这样考虑的话会导致内存溢出,因此这时候就需要用到Map(地图?你在说什么?不是)

要点1:内存溢出
静态分配的局部数组:当我们将数组开在main里头,也就是作为局部变量分配内存的时候,如果不使用new和malloc,这个时候是在栈中分配的,最大不能大于栈(严格来说是数组所在函数栈帧的大小,栈帧又是小于栈的)的大小(1M或2M)。
静态分配的全局数组:也就是把数组开在main外面,在静态存储区分配内存空间,大小受限于静态存储区的大小。
动态分配的数组:在堆中分配内存,是开在堆上的一段不连续空间,大小受限于堆的大小,堆的大小受限于计算机系统中的有效虚拟内存。
总结:所以如果用普通数组来做,可以尝试全局或者动态分配数组,在这两种方法下,数组的最大开辟空间与计算机的内存有很大关系,如果是32位,最大不超过2GB;64位,最大不超过4GB。

要点2:Map

  • Map是STL的一个关联容器
  • 它提供一对一的数据处理能力
  • 内部实现是一颗红黑树(一种非严格意义上的平衡二叉树)这颗树具有对数据自动排序的功能,所以在Map内部所有的数据都是有序的
  • 最重要的表现点是:key—value

本题涉及的相关用法(详细用法可以自行度娘,有超多大佬的分析讲解帖 | | 如果有时间的话,也许我也会开个帖详细讲解,鸽鸽鸽……)

  • Map容器的声明
#include<map>//虽然我比较喜欢用万能头,但还是要记住这个库
map<int,int> image;
  • 查找元素:当所查找的关键key出现时,它返回数据所在对象的位置,如果沒有,返回image与end函数的值相同。
if(image.find(c) != image.end())//c为某定义好的整型变量
   cout<<"Find it!"<<endl;
else
   cout<<"Do not Find!"<<endl;
  • 迭代器:用来指向容器中某个元素的工具,可以更方便地访问容器,本质上是指针(但其实不是,是被封装过的指针)。以下列举本次用到的两种。
方法功能
begin()返回指向容器中第一个(注意,是已排好序的第一个)键值对的双向迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
end()返回指向容器最后一个元素(注意,是已排好序的最后一个)所在位置后一个位置的双向迭代器,通常和 begin() 结合使用。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。

挫挫的代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	int m,n,c;
	map<int,int> color;
	while(scanf("%d %d",&m,&n)!=EOF){
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				cin>>c;
				if(color.find(c)!=color.end()){
					color[c]++;
				}else{
					color[c] = 1;
				}
			}
		}
		int key = 0, value = 0;
		for(map<int,int>::iterator it = color.begin();it!=color.end();++it){
			if(it->second > value){
				key = it->first;
				value = it->second;
			}
		}
		cout<<key;
	}
	return 0;
} 

絮絮叨叨

每天都感觉时间不够用,好想拥有超能力……本来打算每天做五题的,结果速度如此拉胯,数学、专业课、英语、政治还有很多很多要复习,在哭了在哭了(有的时候就好羡慕时空恋旅人的男主,可以不断回到过去)
感觉陷入了恶性循环,越焦虑越难集中导致进度越慢,进度越慢又导致了越焦虑,本质上还是自己的问题……有的时候就觉得一天只有24小时,算来算去真得不够用,自己怎么还能睡觉……哭泣

参考博客

https://blog.csdn.net/qq_43590614/article/details/101107068

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值