2月3日-如何解决算法竞赛中的数组内存溢出问题

问题引入

问题举例

        输入描述

解决方法

解法1

解法2

 map的存放

map的遍历


问题引入

在打算法竞赛数据样本数据总是较大,如果只是在主函数中定义二维数组很容易出现中需要存储的大小超过内存大小的问题,那我们该如何解决这个问题呢?

问题举例

我们以全球变暖(蓝桥杯2018年省赛B组试题)为例进行解决。

我们只解决这道题的输入存储问题,因为只放上输入描述,具体题可在下面的链接进入进行解决

1.全球变暖 - 蓝桥云课 (lanqiao.cn)

你有一张某海域NxN 像素的照片,"."表示海洋、"#"表示陆地,如下所示:

.......

.##....

.##....

....##.

..####.

...###.

.......

其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座岛屿。

输入描述

第一行包含一个整数 N (1≤N≤1000)。

以下 N 行 N列代表一张海域照片。

照片保证第 1 行、第 1 列、第 N 行、第N 列的像素都是海洋。

解决方法

我首先是在主函数中定义了一个二维数组pic[1010][1010],结果运行的时候发生了内存溢出的问题,在网上查了一下,有如下的解决办法

解法1

将这个二维数组放在主函数外,使其成为一个全局数组,这样最大就可存放arr[10720][100000]大小的数组

解法2

如果数据更大,我们可以用到map容器

map容器的头文件#include <map>

详细使用参照这个博客http://t.csdnimg.cn/R72xa

 map的存放

一个map容器含有一个键值和一个value值,这道题可以用map<int,char>pic这样的容器,把arr[100][100]=c替换为pic[100100] = c,键值只要在整型数据大小内就可以完成存储,但是比赛中可能需要定义更大的数组,则需要把 100100转化为“100100”即字符串,然后然后用map<string, char>pic图片

map的遍历

#include <iostream>
#include <map>
using namespace std;

int main() {
    map<string, char> mp;
	map<string,char>::iterator it;
	//定义了一个名为it 的迭代器 
    mp["1010"] = '#';
    mp["1111"] = '.';
    mp["1212"] = '#';
    cout << "遍历如下:"<< endl;
    for ( it = mp.begin(); it != mp.end(); it++) {
        cout << it -> first << " " << it -> second << endl;
    }    
    return 0;
}

得到的结果

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值