NOIP真题做题经历——MLE之内存计算

noip中,试题会有程序运行内存上限(MLE),这个内存上限指的是什么,怎样才能知道自己程序的运行内存?

下面就让我这个今天上午刚刚MLE的鸡来分析一下。

内存上限就是指程序运行时消耗的内存。
如果你声明的是静态的(数组、普通变量等),那内存计算就是单位数*每个单位所用的字节数之和。(动态的东西,我们这里不做研究)

#define ll long long
ll a[400000] ;

定义

我们定义了一个ll类型的a数组。
一个ll占8个字节,那么这个数组就占了400000 * 8 = 3200000B = 3125KB 
依次这么算下去,就可以粗略的估计自己占了多少内存了。

那么问题来了,自己的程序要占多少内存才不会MLE呢?
假如程序要求是128M。那么我们大约留出来10到15MB的内存(供代码的字使用吗,再一个可以防止意外得发生),剩下的110多给变量使用就比较稳妥了。

下面给出各种变量占内存多少的数据以及各个单位的换算关系。

    数据大小          换算关系

事实上我们不需要如同上述那样,开到110MB内存的样子。
  举个栗子来说吧。

就这个题啊——补天计划。我对这个题很无语的,这个题我就MLE了。
  不得不抱怨的是,你会看到这个题根本就没写内存限制是多少。

那么,再来看一下我的代码

 1 #include<iostream>
 2 #include<cmath>
 3 using namespace std;
 4 int du[10050] ={0}, ola[10050] ={0}, n , start  = 0,
 5     map[1050][1050] ={0}, m = 0 , tot = 0;
 6 void dfs(int k){
 7     for(int i = 1 ; i <= m ; i++){
 8         if(map[k][i] != 0){
 9             map[k][i] --;
10             map[i][k] --;
11             dfs(i);
12         }
13     }
14     tot++;
15     ola[tot] = k;
16 }
17
18 int main(){
19     freopen("fence.in" , "r" , stdin);
20     freopen("fence.out" , "w" , stdout);
21     int x , y;
22     cin >> n;
23     for(int i = 1 ; i <= n ; i++){
24         cin >> x >> y;
25         map[x][y] ++;
26         map[y][x] ++;
27         du[x] ++;
28         du[y] ++;
29         m = max(x , m);
30         m = max(m , y);
31     }
32     for(int i = 1 ; i <= m ; i ++) {
33            if(du[i] % 2 == 1){
34                start = i;
35                break;
36            }
37     }
38     if(start == 0){
39         for(int i = 1 ; i <= m ; i ++){
40             if(du[i] > 0){
41                 start = i;
42                 break;
43             }
44         }
45     }
46     dfs(start);
47     for(int i = tot ; i >= 1 ; i--){
48         if(ola[i] > 500)
49         ola[i] %= 500;
50         cout << ola[i] << endl;
51     }
52     return 0;
53 }

补天

(10050 + 10050 + 1050 * 1050) * 8 = 8980800B = 8770.3125KB ≈ 8.6MB

加上代码什么乱七八糟的能占用15MB不得了了(这么小的内存占用也会爆?)

算了,抱怨先不提,回归正题吧。
  定义变量的时候最好能定义  数据范围  的最大值+10到20(防止溢出)这个题我后来改成了定义550*550的二维数组就没有MLE。

另外加一个提示:如果最后两个点数据较大,你没有绝对能做对的方法,而且你还面临着MLE的危险,你到不如就弄到小一点的数据,防止最大化数据结果全部MLE,你内存弄小点得80分和你冒险得0分差别是无限大的。

刚刚有个大佬给出了简便的方法,选中的就是内存大小(B做单位)

这个使用要有前提的(加一些乱七八糟的东西需要配置好G++才行——方法详见另一篇博客【链】

以上两种方法都可以算内存,第二种不会就第一种吧(第二种很显然更科学,不会也无所谓),第一个必须要估计的多一些才行。比直接计算的多留出5到10MB就OK了。

总结结束。采用以上两个方法就能大大减小MLE的几率了。

时间: 2024-10-29 12:28:08

NOIP真题做题经历——MLE之内存计算的相关文章

NOIP真题汇总

想想在NOIP前总得做做真题吧,于是长达一个月的刷题开始了 涉及2008-2016年大部分题目 NOIP [2008] 4/4 1.传纸条:清真的三维DP 2.笨小猴:字符串模拟 3.火柴棒等式:打表+循环 4.双栈排序:贪心+栈 NOIP [2009] 3/4 2.Hankson的趣味题:数论,gcd相关 3.最优贸易:建图+SPFA 4.靶形数独:较难搜索+剪枝 NOIP [2010] 4/4 1.引水入城:DP+bfs(较好) 2.关押罪犯:贪心+并查集 3.机器翻译:模拟 4.乌龟棋:简

csp退役前的做题计划1(真)

csp退役前的做题计划1(真) 因为我太菜了,所以在第一次月考就会退役,还是记录一下每天做了什么题目吧. 任务计划 [ ] Z算法(Z Algorithm) 9.28 [x] ARC061C たくさんの数式 / Many Formulas [x] ARC061D すぬけ君の塗り絵 / Snuke's Coloring [x] ARC061E すぬけ君の地下鉄旅行 / Snuke's Subway Trip [x] ARC061F 3人でカードゲーム / Card Game for Three [

2016 省热身赛做题总结

ACM 总结(第二次) 今天做题目做的不是很理想,一共想了6道题目,A出来两道题目,这也是醉了,,做题目是主要有以下几点要注意: 1.最重要的一点   一定要用scanf, 和printf 因为这个东西,水题A出来是TLE,浪费时间,,, 今天好不容易把第二题做出来,就是因为这个,导致想了好几次算法.. 这个真坑. 以后不管什么样的题目只要做ACM,输入输出都要用c语言的方式,先养成习惯在说..   因为这个很重要,影响心情和时间. 如果你是做ACM的,请注意这一点.... 2.英语是硬伤呀,,

长对话做题规律

一.规律 1.题目与答案来源按照顺序分配,偶尔发生邻近错位: 2.对于大多数题目,都可以按照听啥选啥的原则,当所有选项都听到了,就按照3的方法: 3.做题三大规律:1)重复即所得 2)最后即所得 3)所听即所得 ,注意先后顺序 4.必须通过ABCD预判问题 5.注意个题目之间的逻辑和前后的一致性. 二.策略 1.历年真题反复听,注意对标志词的关注. 2.多记四级单词.

网易2017春招笔试真题编程题集合题解

01 双核处理 题目 一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务.n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间. 输入描述 输入包括两行:第一行为整数n(1 ≤ n ≤ 50)第二行为n个整数lengthi,表示每个任务的长度为length[i]kb,每个数均为1024的倍数. 输出描述输出一个整数,表示最少需

不去死记硬背,大量重复做题的原因

网上看到,稍作整理. ...那是20多年前关于学生学习成绩的事情.那时我想,做父母的都是有文化的人,小孩都是独生子女,学生的学习一定会很优秀的.而事实上,却恰恰相反,初中里有很多学习成绩差的学生. 有个校长对我说,我们学校对学习成绩差的学生没有方法,普通班的学生不愿意学,老师也不愿意教普通班,我对普通班的老师的要求是,学生不要出事就可以了.这些不可救药的差生是怎样冒出来的呢?其实,在小学里就存在着差生隐患,只是在初中隐患爆发了.就是有好多小学生的思辨能力没有跟上去,初中知识对学生的思辨能力要求更

C语言程序设计做题笔记之C语言基础知识(上)

C语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行事.并且C是相当灵活的,用于执行计算机程序能完成的几乎所以的任务,包括会计应用程序.字处理程序.游戏.操作系统等.它不仅是更高级语言(如C++)的基础,目前还以Objective C的形式开发手机应用程序.目前,C语言最新版本由ISO/IEC 9899:2011 文档定义.           数据结构+算法=程序 1.1 C程序和程序设计 (1)以下

C语言程序设计做题笔记之C语言基础知识(下)

C 语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行 事.并且C是相当灵活的,用于执行计算机程序能完成的几乎所以的任务,包括会计应用程序.字处理程序.游戏.操作系统等.它不仅是更高级语言(如C++) 的基础,目前还以Objective C的形式开发手机应用程序.目前,C语言最新版本由ISO/IEC 9899:2011 文档定义.           数据结构+算法=程序 1.1 C程序和程序设计 (1

后缀自动机做题记录

目录 后缀自动机做题记录 sp1811 sp1812 sp10570 luogu 2463 CF873F TJOI2015 弦论 AHOI2013 差异 HEOI2016/TJOI2016 字符串 HAOI2016 找相同字符 SDOI2016 生成魔咒 ZJOI2015 诸神眷顾的幻想乡 留坑待填 广义SAM 其他 NOI原题练习 后缀自动机做题记录 来填之前的坑了...考后大概会做做有字符串的综合题吧 sp1811 lcs板子,对于第一个串建出SAM,第二个串在上面跑,即可求出对于每一个位置